在某些背景下,我构建了我的第一个.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。
答案 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