C# 调试模式下的Windows.Identity返回NT用户名,但在发布到服务器时返回NT AUTHORITY\SYSTEM
在Visual Studio环境中,在调试期间,我通过下面熟悉的c#代码行检索正确的用户名: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身份验证
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,请解释。