【发布时间】:2021-05-10 15:58:25
【问题描述】:
参考 StackOverflow 中的不同问题,并遵循公认的答案:
但是,我仍然无法从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