C# IHttpContextAccessor用户标识为空
参考StackOverflow中的不同问题,并遵循公认的答案: 但是,我仍然无法从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
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?