我在我的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)
答案 0 :(得分:1)
我会调出Fiddler并将其连接到MVC应用程序和浏览器之间,并监控来自浏览器服务器的每一条信息。
Fiddler应该允许你消除客户端,这是必须的 - 你正在调试太多组件的问题。您希望确保您使用的任何浏览器都传递干净且完整的数据。消除问题所在的浏览器或服务器。
我的直觉告诉我,服务器忘记了经过身份验证的用户(可以使用Session_End,Application_End检测并记录它),因为服务器问题和/或AJAX某种程度上不会发送必要的信息来继续保持身份验证cookie活跃。 Fiddler将帮助您弄清楚它们中的哪一个。
Bonus,Fiddler可以允许你重播一个会话 - 这将允许你重现错误 - 如果它在没有浏览器的Fiddler中发生 - 你知道问题在服务器上 - 否则 - 它是浏览器/ ajax。
希望这有帮助,