繁体   English   中英

如何使用 IHttpContextAccessor 获取当前用户 ID?

[英]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();
}

你确定,你需要IHttpContextAccessor吗?

实际上,有一种更好的方法可以从声明中获取 Id:

您可以使用ControllerBase.User属性,但首先要确保您的 controller 派生自ControllerControllerBase (最后一个不支持视图)。

ControllerBase.User 属性

public class YourController : Controller
    {
    ...

    var id = User.FindFirstValue(ClaimTypes.NameIdentifier)

    ...   
    }

实际上,有一种更好的方法可以从声明中获取 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM