gpt4 book ai didi

c# - Request.ServerVariables ["LOGON_USER"] 与 Request.LogonUserIdentity

转载 作者:太空狗 更新时间:2023-10-29 20:27:18 28 4
gpt4 key购买 nike

我试图在没有模拟的情况下从 ASP.Net 应用程序的调用方获取当前 WindowsIdentity。

阅读一些文章后,我的设置是:

  • 在我的 IIS 中,我在身份验证设置中启用了 Windows 身份验证
  • 在我的 web.conf 中,我将身份验证模式设置为“Windows”

出于测试目的,我写了以下日志语句

m_techLogger.Warn(string.Format("Request[LOGON_USER] {0}", Request["LOGON_USER"]));
m_techLogger.Warn(string.Format("Request.LogonUserIdentity {0}", Request.LogonUserIdentity.Name));
m_techLogger.Warn(string.Format("HttpContext.Current.User.Identity {0}", HttpContext.Current.User.Identity.Name));
m_techLogger.Warn(string.Format("WindowsIdentity.GetCurrent() {0}", WindowsIdentity.GetCurrent().Name));

此语句返回以下内容

2015-04-23 10:47:19,628 [7] WARN  - Request[LOGON_USER] DOMAIN\User
2015-04-23 10:47:19,681 [7] WARN - Request.LogonUserIdentity NT AUTHORITY\SYSTEM
2015-04-23 10:47:19,681 [7] WARN - HttpContext.Current.User.Identity NT AUTHORITY\SYSTEM
2015-04-23 10:47:19,681 [7] WARN - WindowsIdentity.GetCurrent() NT AUTHORITY\SYSTEM

我了解 WindowsIdentity.GetCurrent().Name 返回系统用户。我不明白为什么 Request.LogonUserIdentity 和 Request[LOGON_USER] 的输出不同。我需要来自用户的 WindowsIdentity 对象,其名称由 Request[LOGON_USER] 返回。

谁能指出我正确的方向?

最佳答案

Request["LOGON_USER"] 只是客户端发送给服务器的身份验证 header 。这意味着它是向您的服务器发送请求的客户端的登录名。除非您激活模拟,否则不会根据 Active Directory 验证此登录名。更多信息在这里:https://msdn.microsoft.com/en-us/library/ms524602(v=vs.90).aspx

现在,如果不使用模拟,您就会陷入困境。您可以根据服务器上的 AD 检查 Request["LOGON_USER"] 中的用户。但我不建议你这样做。因为恶意客户端可以在该字段中发送任何用户名,如果该用户存在,就会登录到您的服务器。

这样做的正确方法是启用模拟,您使用 AD 组允许用户执行您的服务现在正在执行的操作,您只需将其添加到您的 IIS 配置中即可激活它

<configuration>
<system.web>
<identity impersonate="true"/>
</system.web>
</configuration>

但是如果您真的不能使用模拟,您可以通过使用 Win32 API 模拟服务帐户来摆脱这种情况。如果你想自己做,这里有来自 Microsoft 的示例 https://msdn.microsoft.com/en-us/library/chf6fbt4.aspxhttps://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.aspx

或者您可以在这里找到一个好的包装器:How do you do Impersonation in .NET?

使用起来就这么简单:

using (new Impersonation(domain, username, password))
{
// probably connecting to some bad 3rd party stuff that needs a very specific access.
}

现在不知道你这样做的真正原因,我希望这能帮助你走得更远,只有在绝对必要的时候才这样做

关于c# - Request.ServerVariables ["LOGON_USER"] 与 Request.LogonUserIdentity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29828567/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com