大家好,我们正在从头开始在Windows Azure上运行ASP.NET MCV 3应用程序。 关于身份验证和授权层,我们正在考虑使用访问控制服务。 我阅读了一些关于ACS的文章,其中我得到了基本的想法,但我仍然有一些疑问。
我的理解是,使用ACS我们将身份验证过程外包给一个或多个身份提供商(IP),基本上我们相信另一个系统(即Microsoft Live ID)来验证我们的用户。 基本过程非常简单:在身份验证阶段,我们将用户重定向(ACS执行)到我们的“受信任”IP之一,这会将用户(使用有效令牌)重定向到ACS并最终重定向到我们的应用程序。 这里有很多问题......
由于我们不希望所有拥有Live ID帐户的用户都可以访问我们的应用程序,因此我认为应该有另一个流程来验证该用户并检查他是否在我们的应用程序中注册。 问题是在哪里? 在ACS或我们的应用程序中。?
我对此有所了解,但我不知道这是否是正确的方法: 在注册阶段,系统(我们的网络应用程序)询问用户他想用哪个IP(即Live ID,Google,Facebook和我们的应用程序)在应用程序中验证自己。 然后用户在IP系统上进行身份验证过程,当他回来时,我们将他的用户名(IP用户名)存储在我们的数据库中。 因此,下次在身份验证阶段,我们可以检查该用户是否已在我们的系统中注册。
如果上述理论是正确的,那就意味着我们的应用程序。我们需要建立会员提供商来存储来自IP的用户名和选择我们应用的用户。作为IP。 我对么? 设计上述过程的最佳做法是什么?
现在让我们谈谈授权和“角色”。 它如何与ACS一起使用? ACS是否为每个用户管理多个角色?
我的理解是,使用ACS,您可以创建许多与IP相关的“规则组”,而不是单个用户。 如果这是正确的,我们如何在我们的应用程序中管理角色中的用户? 比方说,我们有多个角色,我们的用户可以与这些角色相关联,我们可以使用ASC来管理吗?
所以最后的问题是: ACS本身是否涵盖整个身份验证和授权过程? 我们还需要使用.net会员提供商吗? 为了满足我们的要求,最佳做法是什么?
非常感谢您的贡献。
答案 0 :(得分:9)
关于注册阶段的问题部分,用于识别用户的最佳方法是NameIdentifier
声明类型
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
。
这对每个身份提供者都应该是唯一的,并且也是固定的。如果您使用电子邮件地址声明,则可能会更改同一用户。从技术上讲,两个身份提供者可能使用相同的NameIdentifier
(没有任何开箱即用的ACS),因此您可以将NameIdentifier声明与IdentityProvider
声明类型结合使用
http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider
保证唯一性。
对于关于角色的部分,我会说使用ACS来发布来自通用身份的角色声明,就像在每个用户的基础上使用ACS中的声明转换规则来管理Google一样。您必须为每个注册用户添加规则 - 可能不可行。我认为ACS规则组更适合转换角色声明(例如,由联合ADFS发布)。你的想法在你的应用程序中这样做是一个更好的恕我直言。在代码中,使用WIF执行此操作的位置是自定义ClaimsAuthenticationManager
。您覆盖其Authenticate
方法,并根据传入原则中的NameIdentifier
声明,查找您的成员资格数据存储区,并根据您的成员资格数据库中的角色创建新的IClaimsPrinciple
(即您为用户所在的每个角色添加角色声明。)
然后,您可以使用自定义ClaimsAuthorizationManager
进行授权决策。网上有一些很好的样本和信息。你可以从
答案 1 :(得分:1)
用户验证过程完成了声明。
使用ACS设置IP后,当用户进行身份验证时,ACS将从IP获取有关已通过身份验证的用户的声明。您需要在ACS中配置规则,以说明要将哪些声明转发到您的应用程序。您还可以将声明转换为不同的类型,以将传入的声明集规范化为您的应用程序所期望的
如果要使用ACS实现基于角色的访问,则可以。在这种情况下,角色只是ACS将发布的另一个声明,您将实施您的应用程序,以根据从ACS收到的角色声明为用户授予权限。
您可以配置将某些IP输入声明映射到角色输出声明的ACS规则。 ACS还有一个管理服务,可以更改这些规则,以便您可以实施用户注册过程。
ACS中的个人声明规则与发出声明的身份提供商相关,但规则组不适用。规则组与RP(您的应用程序)关联。规则组只是一组声明转换规则,告诉ACS:对于此应用程序,在发出令牌时应用此规则组策略"。
ACS文档有很多关于ACS声明规则配置的说法,无论是通过门户网站还是通过管理服务::
https://msdn.microsoft.com/library/azure/hh147631.aspx
扩大回复:
我们假设您正在使用ACS对使用WIF的ASP.NET应用进行身份验证。您可以将ACS配置为发出" Manager"的角色声明。对于谷歌用户的电子邮件" jdoe@gmail.com"。
现在,在您的ASP.NET应用程序中,WIF将看到此角色声明,它将允许您使用HttpContext.Current.User.IsInRole(" Manager")或web.config来控制访问权限等效。
您可以使用Web UI手动管理这些ACS规则,也可以使用ACS管理服务以编程方式实现向ACS添加此类规则的注册过程。 acs.codeplex.com上提供了一些ACS管理服务示例。
此外,身份开发人员培训工具包中有一些关于基于WIF角色的访问的示例:
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=14347