我需要ASP.NET MVC应用程序中的一些功能,在做了一些研究后,我觉得我必须实现自定义MembershipUser,MembershipProvider,Identity和Principal。 我的问题是:我不理解MembershipUser和Identity之间的关系(如果有的话)以及MembershipProvider和Principal究竟在哪里。 请有人请说清楚。我在网上发表了几篇关于所有四个参与者的文章和教程,但没有一个完全解决它们之间的关系。
另外:除了在Global.asax中的AuthenticateRequest期间,是否有一种优雅的方式将自定义主体分配给Context.User?我已经看到很多关于如何在ASP.NET WebForms应用程序中执行此操作的示例,我想知道ASP.NET MVC是否有更好的方法。
答案 0 :(得分:27)
IPrincipal
是为每个Web请求创建的安全上下文,包含与用户身份及其拥有的角色相关的信息。
IPrincipal
包含IIdentity
,其Name
,IsAuthenticated
和AuthenticationType
属性。
自定义MembershipProvider
是一个派生自抽象类MembershipProvider
的类,用于提供有关使用您的应用程序的用户的自定义数据。提供程序将在MembershipUser
类型上运行,可用于为特定用户或用户获取数据,创建新用户等。您可以从MembershipUser
继承以创建自己的用户类型,并且通常可能需要在使用您自己的提供商时执行此操作。
当您访问某个应用程序时,会创建IPrincipal
和IIdentity
并将其分配给HttpContext.Current.User
和Thread.CurrentPrincipal
,以便为在此期间可能采取的任何操作提供安全信息。请求的有效期。
如果您使用的是RoleProvider
,则会创建一个RolePrincipal
类型的实例,该实例会挂钩到已配置的RoleProvider
以获取用户的角色;如果您没有使用RoleProvider
,则会创建GenericPrincipal
类型的实例。
如果您正在使用表单身份验证并且用户已登录,则会创建FormsIdentity
类型实例;如果未对用户进行身份验证,则会创建GenericIdentity
类型实例。创建的IIdentity
最终将序列化为传递回浏览器的身份验证cookie,以及用于在下一个请求中构建FormsAuthenticationTicket
和IIdentity
的内容。 / p>
MembershipProvider
通过提供有关用户的其他信息来适应这一点。静态Membership
类的GetUser()
方法将使用当前IIdentity.Name
和已配置的MembershipProvider
来返回MembershipUser
的实例(如果已定义,则返回派生类一)包含有关用户的数据。
由于ASP.NET MVC构建在ASP.NET处理管道之上,因此您希望设置自己的IIdentity
和IPrincipal
的位置是相同的。据我所知,MVC架构中没有更好的地方可以设置它们。
注意:这都来自内存。如果我有问题,请告诉我,我会更新。