【问题标题】:Windows.Identity in debug mode returns NT username, but returns NT AUTHORITY\SYSTEM when published to server调试模式下的 Windows.Identity 返回 NT 用户名,但在发布到服务器时返回 NT AUTHORITY\SYSTEM
【发布时间】:2015-01-26 17:38:13
【问题描述】:

在 Visual Studio 环境中,在调试期间,我通过下面熟悉的 c# 代码行检索正确的用户名:

WindowsIdentity.GetCurrent().Name;

但是,当我使用 IIS 7.5 将项目发布到 Windows 2008 R2 上的服务器时,它返回给我 NT AUTHORITY\SYSTEM

我已将 web.config 配置为使用

利用配置为使用集成模式并将身份设置为 LocalSystem 的应用程序池

在虚拟文件夹的 IIS 上,我禁用了匿名身份验证并将启用设置为 Windows 身份验证。

这是该公司第一次为 Microsoft 开发而设置,因此努力正确设置环境。

为了让代码正常工作,我缺少什么?或者,有什么更好的代码可以让我返回 Window NY Authentication 用户? 还有一件事:如果我对 strUserName 进行硬编码,则提取用户全名的其余代码可以正常工作。所以 AD 有效。

花了大约一两天的时间来解决这个问题,我们将不胜感激。谢谢,

【问题讨论】:

标签: c# iis-7 windows-authentication windows-identity


【解决方案1】:

以 NT AUTHORITY\SYSTEM(又名 LocalSystem)运行应用程序池是很危险的。这意味着您在 IIS 中运行的所有代码在系统中都具有最高权限。 如果您选择默认的 IIS APPPOOL\Application Pool Name(又名 ApplicationPoolIdentity),则 IIS 将模拟帐户进行处理。

【讨论】:

  • 将它设置回使用 ApplicationPoolIdentity 并且它也返回应用程序池名称。什么以及如何实现您的最后一条语句:“IIS 模拟感谢帐户来处理”?
  • 请确保启用“Windows 身份验证”并禁用“匿名身份验证”。
  • “在虚拟文件夹的 IIS 上,我已禁用匿名身份验证并将启用设置为 Windows 身份验证。”
  • 添加了一张图片。如果 IIS_IUSRS 具有“secpol.msc -> 安全设置 -> 本地策略 -> 用户权限分配 -> 在身份验证后模拟客户端”权限,则不仅“系统”可以模拟登录的人。
  • 在集成管道模式下的 IIS7+ 中不支持模拟,这是因为集成管道支持异步管道,并且对于异步管道,await 可以在与原始线程不同的线程上返回,并且由于模拟是基于线程的上下文,这不起作用。但是,您可以通过设置 <validation validateIntegratedModeConfiguration="false"/> 来禁用此验证,但这可能会产生影响,因此请注意这实际上是您想要做的。
【解决方案2】:

由于我无法找到配置,因此发布了这个 SURPRISE 答案;环境设置和/或代码来确定提取 NT Auth 用户的最佳方法。我最终使用了标准的非常规方式,并放弃了为什么 WindowsIdentity 不起作用。

回到使用这个。它仍在使用“集成”模式和身份设置为“ApplicationPoolIdentity”的应用程序池;并且该站点设置为“启用”仅“Windows 身份验证”。下面的行工作得很好,我得到了我需要的东西。

Request.ServerVariables["AUTH_USER"];

【讨论】:

  • 您尝试关注了吗? Context.User.Identity.Name Context.User.Identity.IsAuthenticated
  • 是的,这是真的。当我查找身份验证类型时,它会出现“Kerbose”?
  • 如果 'Context.User.Identity.IsAuthenticated' 为真且身份验证类型为“Kerberos”,则其身份由 Active Directory 进行身份验证,而不是由恶意用户设置的环境变量“AUTH_USER” :) Active Directory ...基于 LDAP 使用 Kerberos 身份验证,如果不在 AD 环境中,则 Context.User.Identity.AuthenticationType 应该“协商”(表示 NTLM 身份验证)。如果您需要 Kerberos 身份验证,我会解释。
  • 如果我没听错,请不要使用 AUTH_USER。认为解决方案在于使我的公司环境使 Context.User.Identity.AuthenticationType 返回“协商”,但是如何?是的,请说明您是否可以指导我将其设置为 Windows NT 而不是 Kerberos。
【解决方案3】:

这是我解决此问题的方法。它不漂亮,但它有效

将属性 [CustomAuthorize] 添加到我的操作并将类添加到控制器

 [CustomAuthorize]
        public ActionResult Index()
        {
           var http = this.HttpContext;
           String UserID = http.User.Identity.Name; 
            return View();
        }



  public class CustomAuthorize : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return true;
        }
    }

项目具有属性 Windows 身份验证已启用。托管管道模式集成。 已启用项目 Windows 身份验证的 IIS 配置。 应用程序池集成。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2011-03-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多