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

时间:2011-03-08 09:14:48

标签: c# asp.net authentication username kentico

该网站正在我的本地IIS 6.1上运行。我想添加一些功能来从我们的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
  4. 如何获取实际的Windows用户名,例如mydomain / username

    由于

5 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:3)

HttpContext.Current.User.Identity可能对您有用。

同样System.Threading.Thread.CurrentPrincipal可以提供帮助。

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

我不是100%的百分之百,Windows身份验证可能会自动设置,以便您只需检索。

另外,请查看描述基本用户操作的this link from MSDN

答案 2 :(得分: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()),我确信这是运行的身份请求。

答案 3 :(得分:0)

首先,确保网站位于Intranet区域内(例如,仅http://servername/而不是http://www.servername.com/),或者您需要将您的FQDN添加到IE可信站点安全设置。

其次,如果您没有使用Intranet区域,请确保IE正在发送凭据 - 工具 - &gt;互联网选项 - &gt;安全 - &gt;自定义级别 - &gt;用户身份验证 - &gt;登录 - &gt;使用当前用户名和密码自动登录

答案 4 :(得分:-3)

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

如果没有,你将无法得到这个,如果一个随机网站可以获取当前用户登录的域名/用户名,这将是一个巨大的安全问题不是吗?