如何从.Net Core 2.0中的IIS中获取服务层中的NTID

时间:2018-01-11 16:35:39

标签: .net-core asp.net-core-2.0

在某些背景下,我构建了我的第一个.Net Core 2.0 API应用程序,该应用程序托管在公司内部网中,仅供内部员工使用。应用程序需要知道用户在所有页面上的用户,才能正常工作,但我们不想添加登录/注销/身份验证/会话,因为信息不需要保护,只是为了个性化用户的数据。我已成功启用Windows身份验证,当我在控制器中使用以下内容时,我看到显示在屏幕上的用户名(DOMAIN / USERNAME):

User.Identity.Name

但是,我希望在我的UserService中获得相同的用户名(NTID),以便在需要用户名时,任何服务都可以调用UserService来获取用户名。

我在UserService中尝试了以下所有内容,但没有一个从IIS提供NTID:

...
return WindowsIdentity.GetCurrent().Name;
...
return System.Threading.Thread.CurrentPrincipal.ToString();
...
return Environment.UserName;
....

由于这是一个REST API,我不会使用Views(我知道你可以在View中获取用户名)。

是否有一种简单的方法可以在控制器之外获取用户名?我在网上找到了多个例子,但它们都是针对< .Net Core 2.0。

1 个答案:

答案 0 :(得分:0)

在核心中,HttpContext现在是注入,而不是线程静态。这意味着使用静态访问器的旧式风格,例如您尝试过的无法工作。

要访问IHttpContextAccessor中未自动注入的内容(如控制器),您需要注入public class UserService { protected readonly IHttpContextAccessor httpContextAccessor; public UserService(IHttpContextAccessor httpContextAccessor) { this.httpContextAccessor = httpContextAccessor; } ... } 。例如:

var username = httpContextAccessor.HttpContext.User.Identity.Name;

然后,只要您通过ASP.NET Core DI容器注册服务,就会自动将一个实例注入您的服务。然后你可以简单地做:

usemap