我试图从ASP.Net应用程序的调用者那里获取当前的WindowsIdentity而不进行模拟。
在阅读了一些文章后,我的设置是:
出于测试目的,我编写了以下日志语句
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]的输出不同。我需要来自User的WindowsIdentity对象,其名称由Request [LOGON_USER]返回。
有人能指出我正确的方向吗?
答案 0 :(得分:2)
请求[“LOGON_USER”]仅是客户端发送到服务器的身份验证标头。这意味着它是向您的服务器发送请求的客户端的登录名。除非您激活模拟,否则不会针对Active Directory验证此登录名。 更多信息:https://msdn.microsoft.com/en-us/library/ms524602(v=vs.90).aspx
现在没有使用模仿,你就会被卡住。您可以在服务器上针对AD的请求[“LOGON_USER”]中检查用户。但我不建议你这样做。因为恶意客户端只能在该字段中发送任何用户名,并且如果该用户存在,则会在您的服务器上登录。
执行此操作的正确方法是启用模拟,并使用AD组允许用户执行您的服务现在正在执行的操作,并通过将其添加到IIS配置来激活它
<configuration>
<system.web>
<identity impersonate="true"/>
</system.web>
</configuration>
但如果您真的无法使用模拟,则可以通过使用Win32 API模拟服务帐户来解决此问题。 如果您想自己这样做,请参阅Microsoft https://msdn.microsoft.com/en-us/library/chf6fbt4.aspx和https://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.
}
现在我们不知道更多关于你这样做的实际理由我希望这会对你有所帮助,只有在绝对必要的情况下才会这样做
答案 1 :(得分:1)
When I try the same I get
Request.LogonUserIdentity.Name "DOMAIN\\accountname" (no capital letter)
Request["LOGON_USER"] "DOMAIN\\Accountname" (capital letters)
To get the current user in our asp.net application, I user this line of code
User.Identity.Name
Does this help in any way?
答案 2 :(得分:1)
<强> System.Web.HttpContext.Current.User.Identity.Name 强>
获取或设置当前HTTP请求的安全信息。 (您网站上登录用户的姓名)
<强> Request.ServerVariables 强>
获取Web服务器变量的集合。
Request属性提供对HttpRequest类的属性和方法的编程访问。因为ASP.NET页面包含对System.Web命名空间(包含HttpContext类)的默认引用,所以您可以在.aspx页面上引用HttpRequest的成员,而不使用对HttpContext的完全限定类引用。
<强> Conclussion 强>
两者都是相同的,但是,Request.ServerVariables
可以动态地迭代整个集合。
例如:
int loop1, loop2;
NameValueCollection coll;
// Load ServerVariable collection into NameValueCollection object.
coll=Request.ServerVariables;
// Get names of all keys into a string array.
String[] arr1 = coll.AllKeys;
for (loop1 = 0; loop1 < arr1.Length; loop1++)
{
Response.Write("Key: " + arr1[loop1] + "<br>");
String[] arr2=coll.GetValues(arr1[loop1]);
for (loop2 = 0; loop2 < arr2.Length; loop2++) {
Response.Write("Value " + loop2 + ": " + Server.HtmlEncode(arr2[loop2]) + "<br>");
}
}
答案 3 :(得分:1)
尝试过用户
User.Identity.Name
假设您正在使用Windows用户,正如您所提到的那样。它给出了什么输出?
此外,您的配置文件是否具有以下设置:
<authentication mode="Windows"/>
<identity impersonate="true"/>
答案 4 :(得分:0)