此代码来自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;
}
}
通过调用方法设置IsAuthenticated属性(asp.net mvc 4.0示例项目):
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
在上面的FormsAuth ...方法调用之后调试asp.net mvc 4.0示例项目的 LogOn 方法的代码时。执行
User.Identity.IsAuthenticated
仍然返回FALSE。只有当我调试 LogOff 方法
时User.Identity.IsAuthenticated
说真的。那么谁将此属性设置为TRUE和WHEN?
更新:
这是关于 FORMS 身份验证!
我现在调试了asp.net mvc示例项目的LogOn方法,在返回LogOn操作后,调用了我重写的AuthorizeCore方法,然后IsAuthenticated属性为TRUE!
设置TRUE是否依赖于ModelState.Value.Error集合?
如果错误集合中的count == 0,则IsAuthenticated为TRUE 否则IsAuthenticated是假的
你能证实吗?
答案 0 :(得分:23)
此属性由表单身份验证模块通过从请求读取和解析表单身份验证cookie来设置。我已将请求以粗体显示,因为我怀疑这是您观察此行为的原因。让我解释。在成功进行身份验证后致电FormsAuthentication.SetAuthCookie
时,您会将身份验证Cookie添加到响应。此Cookie将存储在客户端浏览器中,并将在后续请求中发送。因此,只有在后续请求中才会将用户视为已通过身份验证。因此,您需要在调用SetAuthCookie方法后始终重定向。在调用此方法的请求中,您已经知道用户是否提供了正确的凭据,因此您不需要检查IsAuthenticated属性。
答案 1 :(得分:1)
属性的来源取决于Identity
的类型。对于FormsIdentity
,该属性只返回true:
/// <devdoc>
/// Indicates whether or not authentication took
/// place.
/// </devdoc>
public bool IsAuthenticated { get { return true;}}
这是有道理的,因为FormsAuthenticationModule.cs
中的代码仅在身份验证后指定FormsIdentity
。代码看起来相当复杂,我看到它从cookie中提取票证,但我找不到它验证票证的位置。