0

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

我正在使用 chrome,当我在 IE 中尝试时没有注意到这个错误(我没有尝试过比在 chrome 中等待的时间更长),那么这个错误是否可能与 chrome 相关?编辑:它也发生在 Firefox 中。

我注意到失败的时间类似于User.Identity.Name 中的问题,Windows 身份验证有时为空白, 但我在 web.config 中没有看到任何关于匿名身份验证的信息

一段时间后,在user.identity.name 中变为空白,问题似乎是在他们的 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)
4

1 回答 1

1

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

  1. 应用程序池是否重新启动,导致它忘记所有经过身份验证的人?
  2. 安全出于任何原因超时并且安全 cookie 过期(或丢失)?
  3. 检查会话是否未重置(使用 Session_Start 和 Session_End 全局事件并将其记录在某处)?

Fiddler 应该允许您消除客户端,这是必须的 - 您正在调试太多组件的问题。您要确保您使用的任何浏览器都在传递干净和完整的数据。从问题中消除浏览器或服务器。

我的直觉告诉我,要么服务器因为服务器问题而忘记了经过身份验证的用户(可以使用 Session_End、Application_End 并记录它)和/或 AJAX 以某种方式没有发送必要的信息来继续保持身份验证 cookie 活着。Fiddler 将帮助您确定它是两者中的哪一个。

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

希望这可以帮助,

于 2012-10-29T15:58:30.180 回答