65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 身份验证管理

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.60/5 (4投票s)

2014年4月30日

CPOL

2分钟阅读

viewsIcon

13838

描述使用 Cookie 进行身份验证管理

引言

本技巧解释了使用 Microsoft ASP.NET 框架通过 Cookie 实现表单身份验证的工作原理。

Using the Code

ASP.NET 框架通过 Cookie 直接维护用户身份验证,因此我们无需在 Web 应用程序中编写这部分代码。

一旦用户通过成员资格提供程序成功进行身份验证,ASP.NET 框架提供 Membership 类来获取与该用户相关的信息。 例如,在任何页面中,调用 Membership.GetUser() 将返回已登录用户对象。 但服务器是无状态的。 那么 ASP.NET 框架如何维护客户端身份?为此,ASP.NET 框架使用 .ASPXAUTH Cookie。

当客户端输入凭据并提交登录页面时,请求会发送到服务器,服务器通过成员资格提供程序对客户端进行身份验证。 身份验证成功后,ASP.NET 框架创建成员资格用户,并连同响应一起发送加密的 .ASPXAUTH Cookie。 该 Cookie 的超时时间与会话超时时间相同。 如果客户端浏览器关闭,该 Cookie 不会被删除。 因此,只要 Cookie 有效,浏览器会将此 Cookie 添加到所有后续请求中,无论浏览器是否已关闭。 服务器将从请求中读取此 Cookie,并通过将以下变量设置为 true 来识别用户已通过身份验证。

Request.IsAuthenticated

这就是为什么在 ASP.NET 应用程序中,登录后,即使关闭浏览器,重新打开浏览器并定向到安全页面也不会要求您输入密码,因为 .ASPXAUTH Cookie 仍然存在于请求中,只要会话没有超时即可。

一旦 Cookie 过期,客户端的下一个请求将不再包含该 Cookie。 因此,服务器将将其视为新请求,从而将 Request.IsAuthenticated 设置为 falseMembership.GetUser() 将为 null ,并且响应将返回登录页面,即使请求是发往安全页面的。 再次,客户端将输入凭据并提交登录页面,并在身份验证后生成一个新的 .ASPXAUTH Cookie 并随响应一起发送。 但是,也可能存在请求已通过身份验证的情况,即发送了 Cookie,但 Membership 中的用户不存在,因为会话已经过期。 为了处理这种情况,我们需要在 global.asax 中添加以下方法。

protected void Application_AuthenticateRequest(object sender,EventArgs e)
{
    if (Request.IsAuthenticated && Membership.GetUser() == null)
    {
        if (HttpContext.Current != null &&HttpContext.Current.Session != null)
        {
            HttpContext.Current.Session.Abandon();
        }
        Response.Cookies.Clear();
        FormsAuthentication.SignOut();
        Response.Redirect(Constants.Pages.Login);
    }
} 
© . All rights reserved.