5 .net c# jwt .net-core asp.net-core
我的 .NET CORE 2.1 Web API 存在一些问题。我使用身份框架和 JWT 令牌进行身份验证,但每当我尝试在控制器中获取当前用户时,我都会收到空引用错误。
从我所看到的来看,所有设置看起来都很好,并且我尝试手动设置身份密钥,但仍然遇到相同的错误。有任何想法吗?
控制器:
var user = await _userManager.GetUserAsync(User);
Run Code Online (Sandbox Code Playgroud)
启动.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<LoginUser, IdentityRole>(options => {
options.ClaimsIdentity.UserIdClaimType =
ClaimTypes.NameIdentifier;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
}
Run Code Online (Sandbox Code Playgroud)
代币生成中的声明:
var claims = new List<Claim>
{
new Claim(JwtRegisteredClaimNames.Sub, user.Id),
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(JwtRegisteredClaimNames.Email, email),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
Run Code Online (Sandbox Code Playgroud)
无法真正解释为什么会发生这种情况,我认为发生这种情况是因为用户没有真正登录,因为 JWT 是无状态的。
但是,由于以下代码片段,我成功获得了当前用户:
private async Task<AppUser> GetUser()
=> await _userManager.FindByIdAsync(User.Claims.FirstOrDefault(c => string.Equals(c.Type, Constants.Strings.JwtClaimIdentifiers.Id, StringComparison.InvariantCultureIgnoreCase))?.Value);
Run Code Online (Sandbox Code Playgroud)