调试模式下的Windows.Identity返回NT用户名,但在发布到服务器时返回NT AUTHORITY \ SYSTEM

时间:2015-01-26 17:38:14

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

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

WindowsIdentity.GetCurrent().Name;

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

我已配置web.config使用     < authentication mode =“Windows”/>

使用配置为使用集成模式且标识设置为LocalSystem的应用程序池

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

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

我想让代码工作的原因是什么?或许,什么是更好的代码,将返回我的Window NY身份验证用户? 还有一件事:如果我对strUserName进行硬编码,则提取User FullName的其余代码可以正常工作。因此AD工作。

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

3 个答案:

答案 0 :(得分:0)

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

Running ApplicaationPoolIdentity can impersonate local Administrator enter image description here

答案 1 :(得分:0)

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

回去使用它。它仍然使用具有“集成”模式的App Pool和设置为“ApplicationPoolIdentity”的Identity;并且该站点仅“启用”为“Windows身份验证”。下面的线很好用,我得到了我需要的东西。

Request.ServerVariables [ “AUTH_USER”];

答案 2 :(得分:0)

这是我解决此问题的方法。它不漂亮,但是可以用

将[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配置。 应用程序池已集成。

希望有帮助。