我正在开发一个 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