【问题标题】:Keep ASP.NET MVC application from referencing older HttpContextBase WindowsIdentity阻止 ASP.NET MVC 应用程序引用旧的 HttpContextBase WindowsIdentity
【发布时间】:2017-04-12 13:34:13
【问题描述】:

我正在开发一个在 Intranet 上运行的 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 对象并使用它来提取名称、域等数据。然后我继续使用这些数据来查询我的数据库中的某些记录和结果这决定了这个函数是返回真还是假。返回 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 变量设置为DOMAIN\USER_1(如上所示),查询数据库,最后确定它不是授权。出现用户名/密码框,用户现在为已授权的 USER_2 输入正确的凭据。用户现在可以访问请求的资源。现在,如果用户关闭浏览器,重新打开它并请求资源(或其他资源),从HttpContextBase 对象中提取的WindowsIdentity 似乎引用了旧的 USER_2 帐户而不是当前的 USER_1 帐户( domainAndUserName 变量最终的值是 DOMAIN\USER_2 而不是 DOMAIN\USER_1)。

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

【问题讨论】:

  • 您是否在应用程序中使用会话?它可以与会话有关吗?您是否尝试过禁用会话?
  • 据我了解,我没有做任何特定的逻辑来设置任何类型的会话。
  • 对于您的具体问题我无能为力,但我建议您更改方法的一些方面。首先,您不应该在属性中进行数据库查询。该属性应该仅具有根据在页面初始化期间执行的先前查询来确定授权的逻辑。其次,您不应该同时使用属性和基于 web.config 的身份验证。事实上,基于 web.config 的授权在 MVC 应用程序中被认为是禁忌,你应该只依赖基于属性的方法。
  • 最后,您可能也在滥用身份模拟。这可能不会像您认为的那样。事实上,您甚至不能在 IIS 中将其与集成管道模式一起使用(您必须在某处选择了经典管道)。通常不应该使用经典模式,除非你有需要它的遗留代码,因为这种模式最终可能会消失。
  • 我理解您关于不在属性中进行数据库查询的评论,我可以将该逻辑移至其他地方。至于基于 web.config 的身份验证,我要求它必须使用 Windows 身份验证,尽管我想我可以检查 WindowsIdentity 是否在属性中进行了身份验证。根据您的第二条评论,我不清楚您的意思。我需要模拟标志来使某些场景和数据库调用更简单和可行。

标签: c# asp.net-mvc windows-identity asp.net-authorization


【解决方案1】:

您可以尝试使用 .current

HttpContext.Current.User.Identity.Name  

【讨论】:

    猜你喜欢
    • 2011-03-31
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2012-07-12
    • 2015-04-21
    • 1970-01-01
    相关资源
    最近更新 更多