如何获取当前用户的Windows身份?

10

该网站运行在我的本地IIS 6.1上。我想要添加一些功能,从我们的Active Directory(AD)中获取信息。我的AD代码在许多其他项目和我的开发服务器上都可以工作。以下是我尝试编写用户名的方式:

Response.Write("1. " + this.Request.LogonUserIdentity.Name);
Response.Write("2. " + Request.ServerVariables["Auth_User"]);
Response.Write("3. " + WindowsIdentity.GetCurrent().Name.ToString());

我得到的结果是:
  1. NT AUTHORITY\IUSR
  2. 管理员
  3. NT AUTHORITY\NETWORK SERVICE
如何获取实际的Windows用户名,例如ourdomain/username
5个回答

15

这里有两个不同的Windows用户 - 第一个是您的应用程序用户,第二个是ASP.NET应用程序(从IIS角度看的应用程序池)正在运行的用户(或Windows帐户)。WindowsIdentity.GetCurrent通常会返回此引用。

要获取实际使用应用程序的Windows用户,您必须强制进行身份验证。为此,您可以在所述网站中启用集成身份验证(Windows身份验证)的IIS。还需修改您的ASP.NET配置以使用Windows身份验证。现在,您可以使用HttpContext.Current.User.Identity来获取实际用户。


4

HttpContext.Current.User.Identity 可能会对您有帮助。

同样,System.Threading.Thread.CurrentPrincipal 也可能会有帮助。

但情况可能是您需要在用户登录时设置身份实例(不一定要实现 IPrincipal 和周围机制,而是使用内置的 WindowsIdentity 实现)。

我不能100%确定,Windows 身份验证 可能会 自动为您设置这个,以便简单地检索。

此外,请查看 MSDN 中描述基本用户操作的链接


2
这个片段展示了如何通过反射设置LogonUserIdentity
 if ((this._wr is IIS7WorkerRequest) && (((this._context.NotificationContext.CurrentNotification == RequestNotification.AuthenticateRequest) && !this._context.NotificationContext.IsPostNotification) || (this._context.NotificationContext.CurrentNotification < RequestNotification.AuthenticateRequest)))
        {
            throw new InvalidOperationException(SR.GetString("Invalid_before_authentication"));
        }
        IntPtr userToken = this._wr.GetUserToken();
        if (userToken != IntPtr.Zero)
        {
            string serverVariable = this._wr.GetServerVariable("LOGON_USER");
            string str2 = this._wr.GetServerVariable("AUTH_TYPE");
            bool isAuthenticated = !string.IsNullOrEmpty(serverVariable) || (!string.IsNullOrEmpty(str2) && !StringUtil.EqualsIgnoreCase(str2, "basic"));
            this._logonUserIdentity = CreateWindowsIdentityWithAssert(userToken, (str2 == null) ? "" : str2, WindowsAccountType.Normal, isAuthenticated);
        }

正如您所看到的,这已经在IIS 7中进行了更改。 我相信您正在使用Windows身份验证+模拟,因此我建议选择最后一个WindowsIdentity.GetCurrent()),我确定它是正在运行请求的标识。


0
首先,请确保网站位于内部网络区域(例如只使用http://servername/而不是http://www.servername.com/),否则您需要将您的FQDN添加到IE的受信任站点安全设置中。
其次,如果您没有使用内部网络区域,请确保IE发送凭据-工具->Internet选项->安全->自定义级别->用户身份验证->登录->使用当前用户名和密码自动登录。

-3

用户是否使用其AD域/用户名登录网站?如果是,请在该点获取用户名/域名。

如果没有,您将无法获取此信息。如果随机网站可以获取当前用户登录的域名/用户名,那将是一个巨大的安全问题,不是吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接