[英]How can I get current user ID using IHttpContextAccessor?
我目前正在使用 .NET Core,我正在尝试获取当前用户 ID。 我知道System.Web
在 NET Core 中不可用,所以我尝试使用IHttpContextAccessor
。
我还将它添加到我的Startup.cs
中: service.AddHttpContextAccessor()
然后我尝试通过在我的 controller 中执行此操作来查找用户 ID:
public Controller(IHttpContextAccessor httpContextAccessor){
var userId = httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier)
}
但它总是返回 null,有谁知道为什么并能够提供建议? 我还禁用了anonymousAuthentication
并将windowsAuthentication
设置为true。
编辑
我对Startup.cs
所做的唯一更改是在ConfigureServices
方法中。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddHttpContextAccessor();
}
实际上,有一种更好的方法可以从声明中获取 Id:
您可以使用ControllerBase.User
属性,但首先,请确保您的 controller 派生自 Controller 或 ControllerBase(最后一个不支持视图)。
使用以下代码片段获取 ASPNET ID
string currentUser = _http.HttpContext.User.Claims.ToList().Find(r => r.Type == "id").Value;
如果您在生成令牌时在声明中包含“ClaimTypes.Name”和用户名值。 然后您可以使用 IHttpContextAccessor 访问用户名,如果添加了相应的依赖项,例如:
var currentUserName = _httpContextAccessor.HttpContext.User.Claims.First(c => c.Type == ClaimTypes.Name).Value;
然后你可以像这样访问用户:
var user = await _userManager.FindByNameAsync(currentUserName);
因此用户ID:
var userId = user.Id;
您需要一个UserManager<ApplicationUser>
的实例。 获取此 class 实例的最简单方法是将其作为参数添加到 class 构造函数中,它将通过依赖注入提供。
string userId = UserManager.GetUserId(httpContextAccessor.HttpContext.User);
不要忘记检查 null 值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.