如何在 IIS7+ 上的 asp.net webApp 中获取 Windows 用户

How to get Windows user in asp.net webApp on IIS7+

我在远程 IIS7+ 服务器上部署了一个 asp.net 4.5 Web 表单 Web 应用程序,我想获取用户的 domain\username 来填充数据库列。

我的 web.config 有以下内容:

<system.web>
   <authentication mode="Windows" />
   <identity impersonate="true" /> <!-- I have tried with and without impersonate-->
   <authorization>
         <deny users="?"/>
   </authorization>
   ...other stuff
</system.web>
<system.webServer>
   <security>
     <authentication>
       <anonymousAuthentication enabled="false" />
       <windowsAuthentication enabled="true" />
     </authentication>
   </security>

   <modules>
      <remove name="FormsAuthentication" />
   </modules>

以下是我尝试过的一些方法:

String username = Membership.GetUser().UserName;
                = HttpContext.Current.User.Identity.Name;
                = Page.User.Identity;
                = User.Identity.Name;
                = Environment.Name; // Or something similar to this I don't remember exactly.

其他注意事项:

Windows 已在服务器上为我的 Web 应用程序启用身份验证。

我一直在获取服务器名称而不是用户名。

此外,我的网络应用程序没有登录。用户对服务器的访问受到限制,但如果他们可以访问服务器,那么他们将自动获得对我的网络应用程序的访问权限。

[更新]

有趣的突破,如果我做一个内联

 <% Response.Write(HttpContext.Current.User.Identity.Name.ToString()); %>

然后 myDomain\username 被写入我的页面。但是,如果我在服务器端执行相同的代码,它 return 是服务器名称。为什么它 return 会有所不同?

我试过下面的代码,但它仍然是 return 服务器名称,我猜是因为内联 运行 客户端和控件 运行 服务器边.

<asp:Label ID="LabelID" Text=" <% HttpContext.Current.User.Identity.Name.ToString(); %>" />

然后在codeBehind

String curUser = LabelID.Text;

见: http://forums.asp.net/t/1121780.aspx?Getting+a+users+DOMAIN+username+from+a+web+application

要获取 asp.net aspx 页面的当前用户 ID 名称,请使用

System.Security.Principal.WindowsIdentity.GetCurrent().Name 

要获得实际登录的人,请使用以下任一方法:

HttpContext.Current.User.Identity.Name
Page.User (wraps HttpContext.Current.User.Identity.Name)
Request.ServerVariables("logon_user")

您可能还需要:

impersonate=true

在您的 web.config 文件中

这篇 post 也可能对您有所帮助: Built-in helper to parse User.Identity.Name into Domain\Username

[编辑] 这个 post 显示了 IIS 7 中发生的事情: How to get at the current users windows identity

这篇 post 希望也能让您了解试错结果的含义: How to get Windows user name when identity impersonate="true" in asp.net?

您的 web.config

中可能还需要以下内容
<authorization>
    <deny users = "?" /><!-- This denies access to the Anonymous user -->
    <allow users ="*" /><!-- This allows access to all users -->
</authorization>

[编辑2] 您观察到的行为表明您正在执行

HttpContext.Current.User.Identity.Name

关于您所调用的内容 "the server side" 在 IIS 的处理管道应用程序生命周期中为时过早,即在身份验证发生之前。

 Response.Write( 

是应用程序生命周期的最后一个方面。看看微软的IIS7生命周期文档:http://msdn.microsoft.com/en-us/library/bb470252.aspx

  1. 验证请求。
  2. 执行 URL 映射。
  3. 引发 BeginRequest 事件。
  4. 引发 AuthenticateRequest 事件。
  5. 引发 PostAuthenticateRequest 事件。
  6. 引发 AuthorizeRequest 事件。
  7. 引发 PostAuthorizeRequest 事件。 ...

只有在这之后才能真正安全地进行您需要的处理