在认证时,我在AuthController
中创建了一些声明(Claims),其中之一是UserID
。
...
Subject = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, user.UserName),
new Claim("UserID", user.Id.ToString()),
})
当 Angular 应用发出请求时,我可以在另一个控制器中获取 UserID
。
Claim claimUserId = User.Claims.SingleOrDefault(c => c.Type == "UserID");
ControllerBase.User
实例包含.Identity
对象,该对象再包含Claims
集合。
Identity.IsAuthenticated
等于True
。Identity.Name
包含admin
字符串(相关用户的名称)。
如果我这样尝试获取用户:
var user = await UserManager.GetUserAsync(HttpContext.User)
user
为空。
也许我忘记添加一些额外的声明?
或者,一旦我使用JWT - 我应该重写默认的UserManager
功能,以便它通过claim
获取用户并保存UserID
?
或者可能有更好的方法?
附加信息:
注册了如下Identity
:
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<AppDbContext>()
.AddDefaultTokenProviders();
ApplicationUser.Id
字段是 bigint
类型(或在 C# 中是 long
类型)
同时,我使用通过 ServiceProvider
解析的 UserManager 在 EF Seed Data
中创建用户。
_userManager = scope.ServiceProvider.GetService<UserManager<ApplicationUser>>();
...
adminUser.PasswordHash = new PasswordHasher<ApplicationUser>().HashPassword(adminUser, "123qwe");
_userManager.CreateAsync(adminUser);