0

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

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

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

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

4

2 回答 2

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 授权模块来自表单身份验证模块)。

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

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

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

于 2013-07-03T18:57:21.810 回答
1

当您覆盖 ASP.Net 成员资格提供程序时。

触发运行 WebSecurity.Login(model.Username, model.Password, persistCookie: false) 的 Login(LoginViewModel model, string returnUrl) 操作。反过来,此方法会在我的自定义成员资格类中触发 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 对象,这是 Membership Provider 的工作。

于 2013-07-03T19:24:05.890 回答