如何在 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
- 验证请求。
- 执行 URL 映射。
- 引发 BeginRequest 事件。
- 引发 AuthenticateRequest 事件。
- 引发 PostAuthenticateRequest 事件。
- 引发 AuthorizeRequest 事件。
- 引发 PostAuthorizeRequest 事件。
...
只有在这之后才能真正安全地进行您需要的处理
我在远程 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
- 验证请求。
- 执行 URL 映射。
- 引发 BeginRequest 事件。
- 引发 AuthenticateRequest 事件。
- 引发 PostAuthenticateRequest 事件。
- 引发 AuthorizeRequest 事件。
- 引发 PostAuthorizeRequest 事件。 ...
只有在这之后才能真正安全地进行您需要的处理