我需要ASP.NET MVC应用程序中的某些功能,并且在进行了一些研究之后,我觉得我必须实现自定义的MembershipUser,MembershipProvider,Identity和Principal。
我的问题是:我不了解MembershipUser和Identity之间的关系,如果有的话,以及MembershipProvider和Principal确切出现在哪里。
有人可以说明一下。我在网上散播了有关这四个玩家的几篇文章和教程,但没有一篇完全解决它们之间的关系。
另外:除了在Global.asax中的AuthenticateRequest期间,是否可以通过一种优雅的方式将自定义主体分配给Context.User?我已经看到了许多有关如何在ASP.NET WebForms应用程序中执行此操作的示例,并且我想知道ASP.NET MVC是否有更好的方法。
最佳答案
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
。MembershipProvider
通过提供有关用户的其他信息来适合此要求。静态 Membership
类的 GetUser()
方法将使用当前IIdentity.Name
和配置的MembershipProvider
返回一个包含用户数据的MembershipUser
实例(如果已定义派生类,则为派生类)。
由于ASP.NET MVC建立在ASP.NET处理管道的顶部,因此您想要设置自己的IIdentity
和IPrincipal
的位置是相同的。据我所知,在MVC架构中没有比这更好的地方了。
注意:这全部来自内存。如果我有什么问题,请告诉我,我会更新。
关于c# - ASP.NET MVC:MembershipUser,Identity,MembershipProvider和Principal之间的关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5610506/