user.identity.name和authenticationtype在mvc 3中为空,大约2分钟后进行Windows身份验证

时间:2012-10-18 01:14:59

标签: asp.net-mvc asp.net-mvc-3

我在我的mvc 3应用程序中使用Windows身份验证,通常一切正常。但是,如果我将某个页面保留大约2分钟,然后发出ajax请求,则User.Identity.Name(在控制器中)将返回空白,authenticationtype也是如此。当我检查user.isinrole(无论如何)时,这会导致失败。通常清除缓存将解决问题,但不能定期刷新。有时我需要清除缓存几次。

我正在使用chrome,并且当我在IE中尝试时没有注意到该错误(我没有尝试等待比使用chrome更长的时间),所以它是否可能与Chrome有关? 编辑:它也发生在Firefox中。

我注意到失败的时间与User.Identity.Name sometimes blank with Windows authentication中的问题类似  但我在web.config

中没有看到任何关于匿名身份验证的内容

user.identity.name becames Blank after a while中,问题似乎是在他们的IIS服务器上启用了匿名身份验证,我也有,但我希望它在我的服务器上设置。某些页面需要匿名访问,因此身份验证全部由MVC强制执行,而不是由服务器强制执行,因此IIS启用了匿名和Windows身份验证

我的system.web标记中有身份验证模式=“Windows”,而web.config中的授权没有任何内容。在global.asax.cs的registerglobals函数中,我有

filters.Add(new RequireWindowsAuth());

这是一个继承自AuthorizeAttribute的类,它会覆盖OnAuthorization方法以执行以下操作

if(!User.IsInRole("Admin") && AdminAttr is defined)
     filterContext.Result = new HttpStatusCodeResult(403, "You are not authorized to view this page");
else if(AllowAnonymousAttribute is not found)
    base.OnAuthorization(filterContext);

当错误发生时,我从服务器得到精确的403响应。

请求的操作有admin attr而不是在其上定义的allowanonymous attr

这是我如何检查正在定义的attrs

filterContext.ActionDescriptor.IsDefined(attr, true) || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AdminAttribute), true)

1 个答案:

答案 0 :(得分:1)

我会调出Fiddler并将其连接到MVC应用程序和浏览器之间,并监控来自浏览器服务器的每一条信息。

  1. 是否重新启动了应用程序池,导致它忘记了所有经过身份验证的人?
  2. 任何原因的安全性超时且安全cookie过期(或丢失)?
  3. 检查Session是否未重置(使用Session_Start和Session_End Global事件并将其记录在某处)?
  4. Fiddler应该允许你消除客户端,这是必须的 - 你正在调试太多组件的问题。您希望确保您使用的任何浏览器都传递干净且完整的数据。消除问题所在的浏览器或服务器。

    我的直觉告诉我,服务器忘记了经过身份验证的用户(可以使用Session_End,Application_End检测并记录它),因为服务器问题和/或AJAX某种程度上不会发送必要的信息来继续保持身份验证cookie活跃。 Fiddler将帮助您弄清楚它们中的哪一个。

    Bonus,Fiddler可以允许你重播一个会话 - 这将允许你重现错误 - 如果它在没有浏览器的Fiddler中发生 - 你知道问题在服务器上 - 否则 - 它是浏览器/ ajax。

    希望这有帮助,