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

23

我有一个使用ASP.NET Core RC2构建的MVC6内部网站。我想获取访问内部网站的人的Windows用户名。

因此,如果Jim访问内部网站,我希望该网站接收到"Domain\Jim",而如果Anne访问内部网站,我希望该网站接收到"Domain\Anne"。

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

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

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

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

我在旧版本的ASP.NET中找到了许多使用HttpContext的示例,并尝试将其注入到我的控制器中,但是用户名最终为空。

//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用户名传递给内部网站的正确方式是什么?


你是否已禁用了网站的匿名访问? - DavidG
您是否已注册任何身份验证中间件? - DavidG
你的网站有登录界面吗?另外,可以通过谷歌搜索找到如何实现此功能的相关信息。以下是一个免费的参考链接:https://dev59.com/oV0a5IYBdhLWcg3wHlek - MethodMan
首先,升级到RTM版本。其次,在http://docs.asp.net上了解什么是ASP.NET Core。您在web.config中设置的设置是无用的,因为它们根本不适用于ASP.NET Core。 - Lex Li
1
我已经在Google上广泛搜索了@MethodMan,但不幸的是,大多数答案都是针对旧版本的ASP.NET而非Core。结果是,包括您提供的解决方案在内的大多数解决方案在ASP.NET Core中无法使用。既没有访问System.Web.Current路径的权限,也没有User.GetUserId()方法。 - Kyle
显示剩余8条评论
4个回答

19
可能会帮助仍在寻找的人。根据微软文档 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-2.2 ,在ConfigureServices方法中添加HttpContextAccessor。 将此httpcontextaccessor传递给控制器并访问已登录的用户。
我按照此步骤操作后,即使将核心网站部署到IIS后,我仍能够获取已登录的Windows认证用户。
以下是代码片段:
在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;
  }
}

2
我建议将这个答案标记为正确答案,以帮助像我一样花了一整天寻找解决方案的人。我遇到了与问题描述相同的问题,即使按照所有 .net core 相关的说明进行操作,仍然无法解决。然而,他的答案——注入 HttpContextAccessor——完美地解决了我的问题。 - m.othman
我的问题... https://stackoverflow.com/questions/58120576/asp-net-core-get-user-not-working-when-deployed-to-iis-and-launch-in-browser - Ziggler
4
用户为什么为空? - user7849697
1
在 Properties/launchSettings 中,您可能需要将您的键/值对设置为以下形式: "windowsAuthentication": true, "anonymousAuthentication": false, - Josh Robinson
我该如何在自定义(授权)属性中使用此 _user 变量?[Authorize("PRIVILE", _user)] => CS0182 属性参数必须是常量表达式、typeof 表达式或属性参数类型的数组创建表达式 - Helmut

8

如果您在内网应用程序上使用Windows身份验证,并且只想能够检索有关用户的信息,那么比您想象的要简单。

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

var userId = this.User.Identity.Name;

在我花费一些时间搜索其他答案之前,我意识到大多数答案都假定我正在实现个人帐户以便对AD进行身份验证,而不是使用开箱即用的Windows身份验证。


3
你好,如果你在 Visual Studio 的调试模式下运行应用程序,“this.User.Identity.Name” 应该会有一个值,还是只能在 IIS 下工作?我正在开发一个 Angular 5 应用程序,在我的控制器中该属性为 null... - Diego
3
是的,@Diego,我遇到了同样的问题。在使用Visual Studio调试应用程序时,上述方法是有效的,但是在启用Windows身份验证的IIS中发布后,上述代码返回null。如果有人能够测试上述代码并确认它在发布后仍然有效,那么我会改变我的投票并且对我自己非常有帮助。谢谢。 - Daniel Jackson
我正在使用IIS中的那行代码来获取用户名。我现在无法访问服务器以检查设置,但如果我没记错的话,帮助我完成此设置的最重要的事情是将应用程序池设置为运行在域帐户上。 - Jonathan Leitner
我的问题.. https://stackoverflow.com/questions/58120576/asp-net-core-get-user-not-working-when-deployed-to-iis-and-launch-in-browser - Ziggler

0

对我来说,使用var userId = this.User.Identity.Name;很有效。我的应用程序正在运行在内部网络上,我只需要从Windows获取用户的登录ID即可,不需要存储用户信息,因为这些信息已经存储在Active Directory中。


3
直到我发布到IIS上才会出现问题。 - Daniel Jackson
一样的情况。我将应用程序发布到IIS上,但它没有正常工作。 https://stackoverflow.com/questions/58120576/asp-net-core-get-user-not-working-when-deployed-to-iis-and-launch-in-browser - Ziggler

0

ServiceSecurityContext.Current?.PrimaryIdentity


看起来需要使用 ASP.NET Core 3+。 - Serj Sagan

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