ASP.NET MVC:MembershipUser,Identity,MembershipProvider和Principal之间的关系

时间:2011-04-10 08:06:37

标签: c# asp.net-mvc forms-authentication

我需要ASP.NET MVC应用程序中的一些功能,在做了一些研究后,我觉得我必须实现自定义MembershipUser,MembershipProvider,Identity和Principal。 我的问题是:我不理解MembershipUser和Identity之间的关系(如果有的话)以及MembershipProvider和Principal究竟在哪里。 请有人请说清楚。我在网上发表了几篇关于所有四个参与者的文章和教程,但没有一个完全解决它们之间的关系。

另外:除了在Global.asax中的AuthenticateRequest期间,是否有一种优雅的方式将自定义主体分配给Context.User?我已经看到很多关于如何在ASP.NET WebForms应用程序中执行此操作的示例,我想知道ASP.NET MVC是否有更好的方法。

1 个答案:

答案 0 :(得分:27)

IPrincipal是为每个Web请求创建的安全上下文,包含与用户身份及其拥有的角色相关的信息。

IPrincipal包含IIdentity,其NameIsAuthenticatedAuthenticationType属性。

自定义MembershipProvider是一个派生自抽象类MembershipProvider的类,用于提供有关使用您的应用程序的用户的自定义数据。提供程序将在MembershipUser类型上运行,可用于为特定用户或用户获取数据,创建新用户等。您可以从MembershipUser继承以创建自己的用户类型,并且通常可能需要在使用您自己的提供商时执行此操作。

当您访问某个应用程序时,会创建IPrincipalIIdentity并将其分配给HttpContext.Current.UserThread.CurrentPrincipal,以便为在此期间可能采取的任何操作提供安全信息。请求的有效期。

如果您使用的是RoleProvider,则会创建一个RolePrincipal类型的实例,该实例会挂钩到已配置的RoleProvider以获取用户的角色;如果您没有使用RoleProvider,则会创建GenericPrincipal类型的实例。

如果您正在使用表单身份验证并且用户已登录,则会创建FormsIdentity类型实例;如果未对用户进行身份验证,则会创建GenericIdentity类型实例。创建的IIdentity最终将序列化为传递回浏览器的身份验证cookie,以及用于在下一个请求中构建FormsAuthenticationTicketIIdentity的内容。 / p>

MembershipProvider通过提供有关用户的其他信息来适应这一点。静态Membership类的GetUser()方法将使用当前IIdentity.Name和已配置的MembershipProvider来返回MembershipUser的实例(如果已定义,则返回派生类一)包含有关用户的数据。

由于ASP.NET MVC构建在ASP.NET处理管道之上,因此您希望设置自己的IIdentityIPrincipal的位置是相同的。据我所知,MVC架构中没有更好的地方可以设置它们。

注意:这都来自内存。如果我有问题,请告诉我,我会更新。