HttpContext.Current.User.Identity.Name 每次都是空的

Posted

技术标签:

【中文标题】HttpContext.Current.User.Identity.Name 每次都是空的【英文标题】:HttpContext.Current.User.Identity.Name is empty every time 【发布时间】:2016-06-13 08:46:06 【问题描述】:

这可能是重复问题,但我没有从其他帖子中找到任何解决方案。

我正在使用 Windows 身份验证,当我在本地系统上构建应用程序时,它工作正常,但是当我在 IIS 上部署应用程序时,HttpContext.Current.User.Identity.Name 返回 null。我在身份验证设置上禁用了除 Windows 身份验证之外的所有内容。

var strUserName = HttpContext.Current.User.Identity.Name == "" ? System.Security.Principal.WindowsIdentity.GetCurrent().Name : HttpContext.Current.User.Identity.Name;

我的 strUserName 为空。

<authentication mode="Windows">
</authentication>

<identity impersonate="true"/>

我尝试分割线并编写代码来检查究竟是什么返回...

 HttpContext.Current.User.Identity.Name is returning null
 System.Security.Principal.WindowsIdentity.GetCurrent().Name is returning NT AUTHORITY\IUSR when impersonate is true
 System.Security.Principal.WindowsIdentity.GetCurrent().Name is returning IIS APPPOOL\ApplicationPoolName when impersonate is false

我检查过以下几个链接

HttpContext.Current.User.Identity.Name is empty using IIS Express but not Visual Studio Development Server

User.Identity.Name with windows authentication

【问题讨论】:

我想向您推荐edit 您的问题并添加您发现的其他类似问题,并尽量避免将您的问题标记为重复。 我相信第二个&lt;authentication&gt; 标签会覆盖上面示例中的第一个标签,因此mode=Windows 不会被拾取。可以尝试合并两个配置项吗? 你指的是服务/WCF吗? 【参考方案1】:

在 Visual Studio 解决方案资源管理器中 - 单击 Web 应用程序项目 -> 在底部选择“属性”选项卡。确保您具有以下设置:

    匿名身份验证 | 已禁用 Windows 身份验证 | 启用

像这样更改您的 Web.config:

  <system.web>
    <authentication mode="Windows"/>
    <compilation debug="true" targetFramework="4.5"/>
    <httpRuntime/>
    <pages controlRenderingCompatibilityVersion="4.0"/>
  </system.web>
  <system.webServer>
    <modules>
      <remove name="FormsAuthentication"/>
    </modules>
  </system.webServer>

现在尝试像这样访问当前的 Windows 用户:

string user = System.Web.HttpContext.Current.User.Identity.Name;

【讨论】:

设置与您建议的相同,当我清理浏览器历史记录并将匿名身份验证再次禁用时,它开始显示用户名密码窗口,但它不接受凭据,我可以远程具有相同的凭据。它不应该直接显示任何弹出窗口,它必须检查用户并重定向到默认屏幕。 你在使用 MVC 吗? 当我尝试添加 然后它显示 IIS APPPOOL\ApplicationName 并且当我让它为真时它显示 NT AUTHORITY\\IUSR,但它是不给用户名。我不知道我是否需要使用模拟 您需要从应用程序中删除所有登录表单以及将用户重定向到登录页面的任何逻辑。您还应该有一个名为 Default.aspx 的主页或配置 IIS 以通过以下方式为另一个页面提供服务如果您的名称不同,则默认为【参考方案2】:

在 web.config 中尝试这些设置

<system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" />
    <authentication mode="Windows" />
    <authorization>
      <deny users="?" />
    </authorization>
</system.web>
<system.webServer> 
</system.webServer>

【讨论】:

以上是关于HttpContext.Current.User.Identity.Name 每次都是空的的主要内容,如果未能解决你的问题,请参考以下文章

HttpContext.Current.User.Identity.Name 为空

HttpContext.Current.User.Identity.Name 每次都是空的

将 HttpContext.Current.User 与异步等待一起使用的正确方法

HttpContext.Current.User.Identity.Name为Empty

ASP.NET C#中怎么让 httpcontext.current.user.identity.name 获取为自定义的值

WindowsIdentity winId = (WindowsIdentity)HttpContext.Current.User.Identity;如何使这个演员工作;目前它失败了