Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调试模式下的Windows.Identity返回NT用户名,但在发布到服务器时返回NT AUTHORITY\SYSTEM_C#_Iis 7_Windows Authentication_Windows Identity - Fatal编程技术网

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

C# 调试模式下的Windows.Identity返回NT用户名,但在发布到服务器时返回NT AUTHORITY\SYSTEM,c#,iis-7,windows-authentication,windows-identity,C#,Iis 7,Windows Authentication,Windows Identity,在Visual Studio环境中,在调试期间,我通过下面熟悉的c#代码行检索正确的用户名: WindowsIdentity.GetCurrent().Name; 但是,当我使用IIS 7.5将项目发布到Windows 2008 R2上的服务器时,它会返回我NT AUTHORITY\SYSTEM 我已将web.config配置为使用 利用配置为使用集成模式且标识设置为LocalSystem的应用程序池 在虚拟文件夹的IIS上,我禁用了匿名身份验证,并将Enable设置为Windows身份验证

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

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

我已将web.config配置为使用

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


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

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

为了让代码正常工作,我缺少了什么?或者,有什么更好的代码可以让我返回Window NY身份验证用户? 还有一件事:如果我硬编码strUserName,那么提取用户全名的其余代码可以正常工作。所以广告起作用了


花一两天的时间来解决这个问题,任何帮助都将不胜感激。谢谢,

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


由于我无法找到配置,所以发布了这个令人惊讶的答案;环境设置和/或代码,以确定提取NT Auth User的最佳方法。我最终使用了标准的非传统方式,并放弃了WindowsIdentity无法工作的原因

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

Request.ServerVariables["AUTH_USER"];

下面是我如何解决这个问题的。它不漂亮,但很管用

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


希望有帮助。

我已经编辑了你的标题。请参阅“”,其中一致意见是“不,他们不应该”。将设置回使用ApplicationPoolIdentity,并返回应用程序池名称。如何实现您的上一条语句:“要处理的IIS模拟帐户”?请确保启用“Windows身份验证”并禁用“匿名身份验证”。在虚拟文件夹的IIS上,我已禁用匿名身份验证并将“启用”设置为Windows身份验证。添加了一个图像。如果IIS_IUSR具有“secpol.msc->Security Settings->Local Policies->User Rights Assignment->身份验证后模拟客户端”权限,则不仅“System”可以模拟登录的用户。在集成管道模式下,IIS7+不支持模拟,这是因为集成管道支持异步管道,使用异步管道,等待可以在与原始线程不同的线程上返回,而且由于模拟是基于线程的上下文,所以这不起作用。但是,您可以通过设置
禁用此验证,但这可能会产生影响,因此请小心,这实际上是您想要做的。您是否尝试过以下操作?Context.User.Identity.Name Context.User.Identity.IsAuthenticatedYes,它是真的。当我查找身份验证类型时,它会显示“Kerbose”?如果“Context.User.Identity.IsAuthenticated”为true且身份验证类型为“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,请解释。