在Web应用程序中使用声明进行身份验证和授权的实际工作流程是什么?

4

我还是不太懂基于声明的身份验证/授权工作流程。

该应用程序允许通过Facebook.com进行身份验证。

用户经过身份验证后,管理员可以授予其拥有经理角色的声明,从而创建另一个声明(在哪里?)

当然,这个声明不会在facebook.com服务器上,问题1:应该将该声明存储在哪里?

当用户以后再次登录时,我会获取来自facebook.com的声明,还应该获取来自应用程序的声明,然后合并它们吗?

工作流程是怎样的?试图了解声明的实际使用。

基本上,Facebook告诉我我是john@doe.com,'填空'添加了一个声明,说我也是domain.com的经理

然后我把这些声明传给domain.com?

我应该如何在asp.net中配置应用程序以信任Facebook和'填空',并从两者都请求声明?

我想我正在使用外部提供程序进行身份验证,而使用自己的提供程序进行授权,这在ASP.NET(Web API / MVC)上如何创建?

更新(为了澄清)

让我们倒退一下。我创建了一个Web应用程序,用户可以注册。 '某种方式'在某个受信任的基于声明的机构(这应该是另一个应用程序?)中,我请求特定用户的声明,以查看其是否具有对我的应用程序的特定权限。

所以我想象一些东西:

/authserver/claims

我的验证会检查是否满足X声明以执行某些操作。

后来我添加到Facebook。现在我有

/facebook/claims

其中告诉我用户是X 和

/authserver/claims,以查看是否可以对资源Y执行操作X。

在ASP.NET上如何管理此类情况?我的自己的声明应该在哪里创建/公开/开发。

我想我在这里缺少一些基本的东西。


你看过使用Facebook和Google OAuth2和OpenID登录创建ASP.NET MVC 5应用程序(C#)吗?本教程向您展示如何构建一个ASP.NET MVC 5 Web应用程序,使用户可以使用来自外部身份验证提供者(如Facebook、Twitter、Microsoft或Google)的凭据进行OAuth 2.0或OpenID登录。为简单起见,本教程重点介绍了使用Facebook和Google凭据的工作方式。 - Erik Philips
@ErikPhilips 是的,我已经实现了。我可以使用Facebook注册用户,很好。现在我想添加声明,以便该用户是管理员并且可以编辑产品。那些数据应该存储在哪里?如何在我的应用程序中使用多个受信任的机构(Facebook和我的自有机构)?我会编辑问题并尝试改进它。 - Bart Calixto
2个回答

1
我认为理解身份验证和授权之间的区别是很重要的。
身份验证 - 确认数据或实体属性的真实性的行为。
授权 - 指定对资源的访问权限的功能,与信息安全和计算机安全有关,特别是与访问控制有关。
因此,对于安全系统,工作流程通常从身份验证开始。当用户第一次连接/使用系统时,他们没有经过身份验证(假设这个用户是匿名类型/组)。系统确定用户未经身份验证的行为本身就是身份验证。基于匿名用户,系统确定该类型用户可以访问什么内容的行为现在授权了用户可以执行的操作。对于非常安全的系统,匿名用户只能访问登录屏幕/页面。一旦登录,用户将被分配一个唯一的身份并分配某种类型的组策略/角色(如果尚未创建)。
对于基于Web的应用程序和需要网站(#1)为另一个网站(#2)进行身份验证的情况,情况会变得更加复杂。当我登录StackOverflow(#1)时,我使用我的Gmail(#2)帐户。我被重定向到Google,并以某种特殊的方式告诉Google我来自哪个页面/要返回哪个页面。这可能是一个特殊的密钥/ URL组合,或者对于不太严格的访问,通常与返回URL有关(在我说“是”的情况下,我回到哪里)。 Google将创建一个特殊的身份验证令牌,该令牌特定于我要返回的URL。它与URL绑定,因为这意味着我的StackOverflow令牌不会允许我或任何其他人登录例如NewEgg之类的网站(换句话说,StackOverflow数据库中的某个人不能使用我的令牌在其他网站上作为我进行身份验证,但从技术上讲,他们可以像我一样登录StackOverflow,但他们拥有该网站,所以这并不重要)。现在我在StackOverflow上进行了身份验证(但从技术上讲,StackOverflow甚至不需要知道关于我的任何信息,只需知道我的令牌)。
作为一个新用户,在StackOverflow上创建了一个新的账户。这个账户可能与我在Stack Overflow上的唯一账户有一对多的关系,以及多个登录(和登录类型,OAuth、OpenID或SO登录)。一旦账户被创建,我就拥有了默认设置的访问权限。如果我需要更多的权限或者某些触发器(比如基于我的声望值:)),我现在可以访问管理员功能(给定某个角色)。该角色与我的账户相关联,并间接与我的身份验证相关联。这意味着我可以创建其他登录(比如本地SO登录),但保留我的账户。
对于每个身份验证资源(Google、Facebook等),都会有不同的身份验证方案,但至少会有一个令牌(或多个令牌)用于网站以一种通用的方式表明我的身份。
因此,网站#1(Stack Overflow)已请求网站#2(Google)对我进行身份验证。但只有网站#1知道我被授权做什么。
对于特定角色的功能,SO上有很多回答处理ASP.Net Identity和角色管理器:

在Asp.net Identity MVC 5中创建角色

MVC 5检查用户角色

更深入地了解MVC中的身份验证-扩展Identity帐户并在ASP.NET MVC 5中实现基于角色的身份验证


很好的解释。你能再详细一些吗?如果SO请求Facebook获取facebook.com/so页面的点赞状态以允许某些功能,我应该将声明存储在我的数据存储中,并在用户登录时更新吗?(我故意混淆了认证和授权) - Bart Calixto
是的,你可以将令牌存储在数据库中。如果你这样做,我强烈建议加密它们。你不希望有人获取你的数据库,然后使用明文令牌登录任何人的账户。 - Erik Philips

0
如果您正在使用ASPNET.Identity(http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity),您可以向用户添加角色声明类型。它将与用户登录相关联,因此当用户使用Facebook进行身份验证时,这些用户声明将被添加并在MVC中可用。
请参见以下代码片段:
var acRes = await UserManager.AddClaimAsync(userId, new Claim(ClaimTypes.Role, "MyRole"));

那么,当我获取外部声明时,我总是将它们设置/保存在自己的声明数据存储中,并且总是从那里请求声明,对吗?并且应该在每次登录时更新? - Bart Calixto
不,通过Facebook的身份验证过程将得到具有Facebook声明的标识。上面的代码存储了特定于应用程序的附加声明类型。最终,所有声明都可以通过身份访问。 - Brendan Green
1
当我使用您提供的代码(用户通过Facebook登录)时,声明存储在哪里?我有一个用户ID,其中包含来自不同提供程序的令牌集合,所有这些令牌都指向同一用户ID,该用户ID还具有来自我的应用程序的声明。当他再次使用我的应用程序用户名/密码登录时,我如何获取Facebook声明? - Bart Calixto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接