C# IHttpContextAccessor用户标识为空

C# IHttpContextAccessor用户标识为空,c#,asp.net-identity,asp.net-core-3.1,C#,Asp.net Identity,Asp.net Core 3.1,参考StackOverflow中的不同问题,并遵循公认的答案: 但是,我仍然无法从IHttpContextAccessor访问UserId,当我尝试访问时,UserId的值为null: var UserId=\u currentUserService.UserId 我的CurrentUserService外观: public class CurrentUserService : ICurrentUserService { private readonly IHttpC

参考StackOverflow中的不同问题,并遵循公认的答案:

但是,我仍然无法从
IHttpContextAccessor
访问
UserId
,当我尝试访问时,UserId的值为null:

var UserId=\u currentUserService.UserId

我的
CurrentUserService
外观:

 public class CurrentUserService : ICurrentUserService
    {
        private readonly IHttpContextAccessor _httpContextAccessor;

        public CurrentUserService(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }

        private bool _init = false;
        private string _userId;
        public string UserId
        {
            get
            {
                if (!_init)
                {
                    _userId = _httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
                    _init = true;
                }
                return _userId;
            }
        }
        ///public string UserId { get { return _httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier); } }

        public bool IsAuthenticated => _httpContextAccessor.HttpContext.User.Identity.IsAuthenticated;

    }
当我未登录并尝试访问控制器时,它会重定向到登录页面。登录后,
\u httpContextAccessor.HttpContext?.User的值也将被填充,如下图所示:

是我遗漏了什么,还是设计框架的问题

我试图调用
用户ID
的示例

鉴于:

 <div class="row">
        <div class="col-md-12">
            <a asp-action="BorrowRequest" asp-controller="Book" asp-route-bookId="@Model.Id" class="btn btn-primary">
                Request for Borrow
            </a>
        </div>
 </div>

借款申请
在控制器中:

[HttpGet]
[Authorize]
public async Task<ActionResult> BorrowRequest(int bookId)
{
    try
    {
        var UserId = _currentUserService.UserId;

        await Task.Delay(200);
        return RedirectToAction(nameof(Index));
    }
    catch
    {
        return View();
    }
}
[HttpGet]
[授权]
公共异步任务请求(int bookId)
{
尝试
{
var UserId=\u currentUserService.UserId;
等待任务。延迟(200);
返回重定向到操作(名称(索引));
}
抓住
{
返回视图();
}
}

有人将用户id的声明名称从
ClaimTypes.NameIdentifier
替换为
sub
,如图所示

因此,为了不让Microsoft Identity覆盖我使用的声明名称:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear()就在API启动中的
app.UseAuthentication()
之前


引用:

取决于访问上下文的时间。它必须在请求的范围内被调用?@Nkosi我已经更新了我的代码。这会给你的问题提供答案吗?检查我之前给出的类似问题的答案,看看它是否有帮助。我也没有在图片中看到明显的用户id声明。您使用图像中的哪个声明作为用户id?