如何使用 ASP.NET Core RC2 MVC6 和 IIS7 获取当前 Windows 用户

Posted

技术标签:

【中文标题】如何使用 ASP.NET Core RC2 MVC6 和 IIS7 获取当前 Windows 用户【英文标题】:How to get the current Windows user with ASP.NET Core RC2 MVC6 and IIS7 【发布时间】:2016-07-06 21:21:05 【问题描述】:

我有一个使用 ASP.NET Core RC2 在 MVC6 中构建的 Intranet 站点。我想获取访问 Intranet 站点的人的 Windows 用户名。

因此,如果 Jim 访问 Intranet 站点,我希望该站点接收“Domain\Jim”,而如果 Anne 访问 Intranet 站点,我希望该站点接收“Domain\Anne”。

在我的 IIS 服务器上仅启用了 Windows 身份验证,禁用了匿名身份验证。

我的网站设置为使用 Windows 身份验证并禁用匿名身份验证。

<system.web>
    <authentication mode="Windows" />
    <authorization>
        <deny users="?"/>
    </authorization>
</system.web>

通过调试,我可以使用System.Security.Principal.WindowsIdentity.GetCurrent().Name,但这当然会在 IIS 服务器上返回“IIS APPPOOL\SiteName”。

我从旧版本的 ASP.NET 中找到了许多使用 HttpContext 的示例,我尝试将其注入到我的控制器中,但 userName 最终为 null。

//Startup.cs
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

//HomeController.cs
public HomeController(IHttpContextAccessor _accessor)

    string userName = _accessor.HttpContext.User.Identity.Name;

在 ASP.NET Core RC2 MVC6 中将 Windows 用户名传递到 Intranet 站点的正确方法是什么?

【问题讨论】:

您是否禁止匿名访问您的网站? 是的。我在 中使用以下内容禁用了它。 我已经用 块更新了我的问题。 你注册了认证中间件吗? 您的网站是否有登录屏幕..?也做一个谷歌搜索有关于如何做到这一点的信息。这是一个免费的***.com/questions/30701006/… 我已经在 Google 上广泛搜索了 @MethodMan,但不幸的是,大多数答案都是针对旧版本的 ASP.NET,而不是 Core。结果是大多数解决方案(包括您链接的解决方案)在 ASP.NET Core 中不起作用。既无法访问 System.Web.Current 路径,也没有 User.GetUserId() 方法。 【参考方案1】:

可能会帮助仍在寻找的人。根据 MS https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-2.2 的文档,在 ConfigureServices 方法 (startup.cs) 中添加 HttpContextAccessor 将此 httpcontextaccessor 传入控制器并访问已登录的用户。

我遵循了这一点,即使在将核心网站部署到 IIS 之后,我也能够获得登录的 Windows Authenticated 用户。

这里是代码sn-ps

在 Startup.cs(在 ConfigureServices 方法下)添加行

services.AddHttpContextAccessor();

然后在您的控制器文件中,添加以下必要的代码行。下面的代码是一个示例。

public class YourController : Controller

  private readonly IHttpContextAccessor _httpContextAccessor;
  private readonly string _user;
  public YourController(IHttpContextAccessor httpContextAccessor)
  
    _httpContextAccessor = httpContextAccessor;
    _user = _httpContextAccessor.HttpContext.User.Identity.Name;
  

【讨论】:

我建议将此答案标记为正确答案,以帮助像我这样花了一天时间寻找解决方案的人。即使遵循所有 .net 核心相关说明,我也遇到了与问题相同的问题。但是,他的答案是注入 HttpContextAccessor,效果很好。 我的问题...***.com/questions/58120576/… 用户怎么是NULL? 在 Properties/launchSettings 中,您可能需要使您的键/值对看起来像这样:"windowsAuthentication": true, "anonymousAuthentication": false,【参考方案2】:

对于在 Intranet 应用程序上使用 Windows 身份验证的任何其他人,他们只想能够检索有关用户的信息,您可能会认为它更简单。

在您的控制器中,此行将获取 DOMAIN\username 形式的当前用户的用户名。

var userId = this.User.Identity.Name;

我花了一些时间查看其他答案,然后才意识到他们中的大多数人认为我正在实施个人帐户以针对 AD 进行身份验证,而不是开箱即用的 Windows 身份验证。

【讨论】:

您好,如果您在调试模式下从 Visual Studio 运行应用程序,“this.User.Identity.Name”应该有一个值,或者它只能在 IIS 下工作?我正在做一个 Angular 5 应用程序,在我的控制器上我有 null.... 是的@Diego 我也有同样的问题。上面在从 Visual Studio 调试应用程序时有效,但在启用 Windows Auth 的情况下发布到 IIS 后,上面返回 null。如果有人可以在上面发短信并确认它在发布后有效,那么我将改变我的投票,这将对我自己很有帮助。谢谢。 我在 IIS 中使用该行来获取用户名,我现在无法访问服务器以检查设置,但如果内存服务于帮助我获得此设置的最大因素是将应用程序池设置为在域帐户上运行。 我的问题..***.com/questions/58120576/…【参考方案3】:

使用var userId = this.User.Identity.Name; 为我工作。我的应用程序在 Intranet 上运行,我想做的就是从 Windows 获取用户的登录 ID。我不需要存储用户信息,因为这些信息已经存储在 Active Directory 中。

【讨论】:

在我发布到 IIS 之前为我工作。 这里也一样。。我发布到 IIS,但它不起作用。。***.com/questions/58120576/…【参考方案4】:

ServiceSecurityContext.Current?.PrimaryIdentity

【讨论】:

看起来这需要ASP.NET Core 3+

以上是关于如何使用 ASP.NET Core RC2 MVC6 和 IIS7 获取当前 Windows 用户的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET core rc2 中禁用浏览器缓存?

在 asp.net core rc2 中指定代理

ASP.NET Core RC2 Jwt 令牌 KID 错误

ASP.NET Core RC2 中的依赖注入失败

在 ASP.NET Core RC2 中使用 AddAuthentication 时的不明确调用

ASP.net Core RC2 Web API POST - 何时使用 Create、CreatedAtAction 和 CreatedAtRoute?