成员身份验证流程如何工作?这个过程中每个步骤的责任是什么?

时间:2013-07-03 18:28:31

标签: .net authentication asp.net-mvc-4 asp.net-membership

我很难找到关于这个问题的充分文档,但我的问题是:MVC4中的身份验证流程是什么?我正在使用自定义提供程序(我仍在编码中,因为我对框架有了更好的理解)。让我详细说明我目前的理解,以便我可以将我的问题放在上下文中:

据我了解,当用户登录时,Login(LoginViewModel model, string returnUrl)操作会被触发,该操作会运行WebSecurity.Login(model.Username, model.Password, persistCookie: false)。反过来,此方法在我的自定义成员资格类中触发ValidateUser。从这里,我需要做我的工作来实际验证用户。我目前正在做的是点击我们的身份验证服务来接收访问权限并刷新令牌并将其存储在cookie中。

那么,用户验证后它是如何工作的?框架如何知道用户仍然登录或注销,用户超时等?我觉得在ValidateUser过程中我需要做一些事情来对用户主体做一些事情。

如果您能帮助我更好地了解这一过程,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

表单身份验证基于成功身份验证时发出的cookie。将cookie返回给浏览器,然后随每个请求一起发送,它是浏览器的责任。您可以使用http调试器实际查看服务器首先发出的cookie,然后在每次发出请求时发送,Fiddler会这样做,但它甚至可能是HttpFox。

当请求到达服务器时,ASP.NET管道涉及一系列http模块,用于触发管道的连续事件。

http://msdn.microsoft.com/en-us/library/bb470252%28v=vs.100%29.aspx

其中一个模块FormsAuthenticationModule负责检查cookie并根据cookie设置请求主体(HttpContext.Current.User)。 cookie数据经过加密,因此不会忘记客户端,但服务器会对其进行解密,并找出用户的名称和cookie有效的时间跨度。另一个模块,UrlAuthorizationModule负责检查当前主体是否被授权实际访问资源,如果没有,则将请求重定向到登录页面(我可能错了,但我记得从表单身份验证模块中调用url授权模块。

这在管道的早期,AuthenticateRequestAuthorizeRequest事件中发生。如果表单模块成功并且设置了Context.User,则管道的剩余部分可以只访问它并读取当前用户的信息。此外,这发生在每一个请求期间:每次发出请求时,您的cookie都会被解密,请求主体会在请求的生命周期内设置。

这也意味着您可以将表单身份验证模块替换为负责设置请求主体的任何其他模块。表单模块的可行替代方法是内置SessionAuthenticationModule,它基于相同的原则集,但也克服了表单模块的一些缺点。

http://netpl.blogspot.com/2012/09/forms-authentication-revisited.html

答案 1 :(得分:1)

当您覆盖ASP.Net会员提供商时。

  

登录(LoginViewModel模型,字符串returnUrl)动作被触发了   运行WebSecurity.Login(model.Username,model.Password,persistCookie:   假)。反过来,此方法在我的自定义中触发ValidateUser   会员级。从这里开始,我需要做我的工作   验证用户。我目前正在做的是打击我们的身份验证   服务接收访问权限=> 以下是

您不需要自己创建Cookie。

public override bool ValidateUser(string username, string password)
{
   // just return true or false based on your auth service.
   // No need to create an authentication cookie.
   // Membership provider will create it for you if return is true.
}

当经过身份验证的用户请求页面时,MembershipProvider调用GetUser方法获取MembershipUser对象并创建IPrincipal对象。

public override MembershipUser GetUser(string username, bool userIsOnline)
{       
   // Your code need to return MembershipUser like this -
   // return new MembershipUser(...)
   // Again you do not need to create IPrincipal object by yourself. 
}

通过覆盖这两种方法,用户可以登录您的网站。 同样,您不需要创建身份验证Cookie和Principal对象,这是会员提供商的工作。