Asp.net mvc 3 Azure ACS-最佳实践实施

Asp.net mvc 3 Azure ACS-最佳实践实施,asp.net-mvc-3,azure,wif,acs,Asp.net Mvc 3,Azure,Wif,Acs,我们正在从头开始构建一个ASP.NET MCV 3应用程序,该应用程序在Windows Azure上运行。关于身份验证和授权层,我们考虑使用访问控制服务。我读了一些关于ACS的文章,从中我得到了基本的想法,但我仍然对它有一些怀疑 我的理解是,使用ACS,我们将身份验证过程外包给一个或多个身份提供商(IP),基本上我们信任另一个系统(即Microsoft Live ID)对我们的用户进行身份验证 基本过程非常简单:在身份验证阶段,我们将用户重定向(ACS执行此操作)到我们的一个“受信任”IP,这将

我们正在从头开始构建一个ASP.NET MCV 3应用程序,该应用程序在Windows Azure上运行。关于身份验证和授权层,我们考虑使用访问控制服务。我读了一些关于ACS的文章,从中我得到了基本的想法,但我仍然对它有一些怀疑

我的理解是,使用ACS,我们将身份验证过程外包给一个或多个身份提供商(IP),基本上我们信任另一个系统(即Microsoft Live ID)对我们的用户进行身份验证

基本过程非常简单:在身份验证阶段,我们将用户重定向(ACS执行此操作)到我们的一个“受信任”IP,这将用户重定向(使用有效令牌)到ACS,并最终重定向到我们的应用程序

下面是一些问题:

由于我们不希望所有具有Live ID帐户的用户都可以访问我们的应用程序,因此我认为应该有另一个过程来验证该用户并检查他是否在我们的应用程序中注册。问题是在哪里?在ACS中还是在我们的应用程序中

我对此有一个想法,但我不知道这样做是否正确:

在注册阶段,系统(我们的web应用程序)询问用户希望使用哪个IP(即Live ID、Google、Facebook和我们的应用程序)在应用程序中对自己进行身份验证。然后用户在IP系统上进行身份验证,当他回来时,我们将他的用户名(IP用户名)存储在数据库中。 所以,下一次,在身份验证阶段,我们可以检查该用户是否在我们的系统中注册

如果上述理论是正确的,这意味着在我们的应用程序中。我们需要建立我们的会员提供商来存储来自IP和选择我们应用程序的用户的用户名。作为知识产权。 我说得对吗?设计上述流程的最佳实践是什么

现在让我们谈谈授权和“角色”。它如何与ACS一起工作?ACS是否为每个用户管理多个角色

我的理解是,使用ACS,您可以创建许多与IP相关的“规则组”,而不是与单个用户相关。如果这是正确的,我们如何在应用程序中管理角色中的用户?比如说,我们有多个角色,我们的用户可以关联到这些角色,我们可以使用ASC来管理它吗


所以最后的问题是:ACS本身是否涵盖了整个认证和授权过程?我们还需要使用.net成员资格提供程序吗?为了满足我们的需求,最佳实践是什么?

用户验证过程是通过索赔完成的

使用ACS设置IP后,当用户进行身份验证时,ACS将从IP获取有关已验证用户的声明。您需要在ACS中配置规则,以说明希望将哪些声明转发到应用程序。您还可以将声明转换为不同的类型,以将传入的声明集规范化为应用程序所期望的

如果您想通过ACS实现基于角色的访问,您可以。在本例中,角色只是ACS将发出的另一个声明,您将实现应用程序,根据从ACS收到的角色声明授予用户权限

您可以配置将某些IP输入声明映射到角色输出声明的ACS规则。ACS还有一个管理服务,可以更改这些规则,以便实现用户注册过程

ACS中的单个声明规则与发出声明的身份提供程序相关,但规则组不相关。规则组与RPs(您的应用程序)关联。规则组只是一组声明转换规则,告诉ACS:“对于此应用程序,在发出令牌时应用此规则组策略”

ACS文档通过web门户和管理服务对ACS索赔规则的配置有很多说明:

扩展响应:

假设您正在使用ACS对使用WIF的ASP.NET应用程序进行身份验证。您可以将ACS配置为向带有电子邮件的google用户发出“Manager”角色声明jdoe@gmail.com“

现在,在您的ASP.NET应用程序中,WIF将看到此角色声明,它将允许您使用HttpContext.Current.User.IsInRole(“管理器”)或等效的web.config来控制访问

您可以使用web UI手动管理这些ACS规则,也可以使用ACS管理服务实现注册过程,以编程方式将这些规则添加到ACS。ACS.codeplex.com上提供了一些ACS管理服务示例

此外,identity developer培训工具包还提供了一些关于WIF基于角色访问的示例:


关于注册阶段的问题,用于识别用户的最佳方法是
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发布来自通用标识(如Google)的角色声明将很难使用ACS中基于每个用户的声明转换规则进行管理。您必须为每个注册用户添加一个规则-可能不可行。我认为ACS规则组更适合角色声明的转换(例如,由联邦ADF发布)。你在你的应用程序中这样做的想法更好。在代码中,使用WIF执行此操作的位置位于自定义
ClaimsAuthenticationManager
中。您将覆盖其
身份验证
方法a