防止 ASP.NET MVC应用程序引用较旧的HttpContextBase WindowsIdentity



我正在开发一个 C# ASP.NET MVC 应用程序,该应用程序使用 Windows 模式身份验证在内部网上运行,Web.config文件中的以下<system.web>部分:

<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
<authentication mode="Windows" />
<authorization>
<deny users="?" />
</authorization>
<identity impersonate="true" />
</system.web>

我创建了自己的类,该类扩展了AuthorizeAttribute以基于连接的 Windows 帐户执行一些处理。在被覆盖的AuthorizeCore函数中,我从HttpContextBase.User.Identity中获取WindowsIdentity对象,并使用它来提取名称、域等数据。然后,我继续使用此数据查询数据库中的某些记录,其结果确定此函数返回 true 还是 false。返回 false 后,浏览器会弹出一个简单的用户名和密码框,允许用户提供不同的 Windows 帐户/密码来使用,而不是当前用户登录时使用的帐户/密码。

AuthorizeCore函数在我的项目中的外观示例如下:

protected override bool AuthorizeCore(HttpContextBase httpContext)  
{
using (DbEntities dbContext = new DbEntities ())
{
bool authorize = allowedGroups.Length == 0;
string domainAndUserName = httpContext.User.Identity.Name;
int userNameIndex = domainAndUserName.IndexOf(@"", StringComparison.OrdinalIgnoreCase) + 1;
string userName = domainAndUserName.Substring(userNameIndex);
try
{
// Process account and query database...
// set authorize to true if criteria met, otherwise false...
}
catch (EntityException ex)
{
authorize = false;
}
catch (SqlException ex)
{
authorize = false;
}
return authorize;
}
}

假设具有 Windows 帐户的用户USER_1连接,AuthrorizeCore函数然后将domainAndUserName变量设置为DOMAINUSER_1(如上所示),查询数据库,并最终确定它未获得授权。此时将显示用户名/密码框,用户现在输入已授权USER_2的正确凭据。用户现在能够访问请求的资源。现在,如果用户关闭浏览器,重新打开它,并请求资源(或其他资源),则从HttpContextBase对象中提取的WindowsIdentity似乎引用较旧的USER_2帐户而不是当前USER_1帐户(domainAndUserName变量最终的值为DOMAINUSER_2而不是DOMAINUSER_1)。

似乎如果我稍等片刻,那么它将使用该USER_1WindowsIdentity,因此它看起来像是一些缓存功能在起作用,但我无法验证或查明这一点。我已经在网上进行了一些搜索,并尝试在IIS服务器上完全禁用缓存以及清除浏览器缓存,但我仍然遇到这种情况。有关如何始终使AuthorizeCore函数的HttpContextBase.User.Identity始终引用当前Windows帐户的任何帮助或指导将不胜感激。

您可以尝试使用 .current

HttpContext.Current.User.Identity.Name  

最新更新