Eli*_*eth 24 authentication asp.net-mvc forms-authentication
此代码来自asp.net mvc RTM源代码
谁设置了HttpContext.User.Identity的IsAuthenticated属性?
protected virtual bool AuthorizeCore(HttpContextBase httpContext) {
if (httpContext == null) {
throw new ArgumentNullException("httpContext");
}
IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
是通过调用方法设置IsAuthenticated属性(asp.net mvc 4.0示例项目):
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
Run Code Online (Sandbox Code Playgroud)
当我在上面的FormsAuth ...方法调用之后调试asp.net mvc 4.0示例项目的LogOn方法的代码时.执行
User.Identity.IsAuthenticated
Run Code Online (Sandbox Code Playgroud)
仍然返回FALSE.只有当我调试LogOff方法时
User.Identity.IsAuthenticated
Run Code Online (Sandbox Code Playgroud)
说真的.那么谁将这个属性设置为TRUE和WHEN?
更新:
这是关于FORMS身份验证!
我现在调试了asp.net mvc示例项目的LogOn方法,并在返回LogOn操作后,调用了我重写的AuthorizeCore方法,然后IsAuthenticated属性为TRUE!
TRUE的设置是否依赖于ModelState.Value.Error集合?
如果错误集合中的count == 0,则IsAuthenticated为TRUE,否则IsAuthenticated为FALSE
你能证实吗?
Dar*_*rov 24
此属性由表单身份验证模块通过从请求中读取和解析表单身份验证cookie来设置.我把请求以粗体显示,因为我怀疑这就是你观察这种行为的原因.让我解释.当您调用FormsAuthentication.SetAuthCookie
成功身份验证时,您将身份验证cookie添加到响应中.此cookie将存储在客户端浏览器中,并将在后续请求中发送.因此,只有在后续请求中才会将用户视为已通过身份验证.因此,您需要在调用SetAuthCookie方法后始终重定向.在调用此方法的请求中,您已经知道用户是否提供了正确的凭据,因此您无需检查IsAuthenticated属性.