【问题标题】:IHttpContextAccessor UserId is nullIHttpContextAccessor 用户 ID 为空
【发布时间】:2021-05-10 15:58:25
【问题描述】:

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

IHttpContextAccessor.HttpContext.User.Identity shows all null properties in CurrentUserService service

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

var UserId = _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;

    }

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

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

我尝试调用 UserId 的示例。

在视图中:

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

【问题讨论】:

  • 取决于您何时访问上下文。它必须在请求的范围内。
  • 您的流程中的哪个位置调用了_currentUserService.UserId;?
  • @Nkosi 我已经更新了我的代码。这能回答你的问题吗?
  • 查看我之前给出的类似问题的答案,看看它是否有帮助stackoverflow.com/a/39934077/5233410
  • 我也没有在图片中看到用户 ID 的明显声明。您将图片中的哪个声明用作用户 ID?

标签: c# asp.net-identity asp.net-core-3.1


【解决方案1】:

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

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

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

参考:Why is ClaimTypes.NameIdentifier not mapping to 'sub'?

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 2020-10-05
    • 2020-06-11
    • 2022-07-07
    • 2019-12-01
    • 2020-02-04
    • 1970-01-01
    • 2017-08-11
    相关资源
    最近更新 更多