USER“]与Request.LogonUserIdentity

我试图从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] DOMAINUser
    2015-04-23 10:47:19,681 [7] WARN  - Request.LogonUserIdentity NT AUTHORITYSYSTEM
    2015-04-23 10:47:19,681 [7] WARN  - HttpContext.Current.User.Identity NT AUTHORITYSYSTEM
    2015-04-23 10:47:19,681 [7] WARN  - WindowsIdentity.GetCurrent() NT AUTHORITYSYSTEM
    

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

    任何人都可以指引我走向正确的方向吗?


    当我尝试相同的时候,我会得到

        Request.LogonUserIdentity.Name  "DOMAINaccountname"   (no capital letter)
        Request["LOGON_USER"]   "DOMAINAccountname"   (capital letters)
    

    为了在我们的asp.net应用程序中获得当前用户,我使用这一行代码

    User.Identity.Name
    

    这有帮助吗?


    请求[“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模拟一个服务帐户来解决这个问题。 如果你想自己做这些,可以参考微软的https://msdn.microsoft.com/en-us/library/chf6fbt4.aspx和https://msdn.microsoft.com/en-us/library/system .security.principal.windowsidentity.aspx

    或者你可以在这里找到一个很好的包装:你如何在.NET中进行模拟?

    使用它就像这样简单:

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

    现在不知道更多关于你这样做的真正原因,我希望这会帮助你继续前进,只有在绝对必要时才能做到这一点


    System.Web.HttpContext.Current.User.Identity.Name

    获取或设置当前HTTP请求的安全信息。 (您网站上登录用户的名称)

    Request.ServerVariables

    获取Web服务器变量的集合。

    Request属性提供对HttpRequest类的属性和方法的编程访问。 因为ASP.NET页面包含对System.Web命名空间(包含HttpContext类)的默认引用,所以可以在.aspx页面上引用HttpRequest的成员,而不使用对HttpContext的完全限定类引用。

    结论两者的工作原理相同,但是,如果使用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>");
       }
    }
    
    链接地址: http://www.djcxy.com/p/84563.html

    上一篇: USER"] vs. Request.LogonUserIdentity

    下一篇: Adding UIAutomation Providers to Delphi controls (specifically grids)