我正在尝试在ASP.NET Core MVC中构建一个网站,并且正在使用Microsoft.Identity库。我在User
(ApplicationUser)类中有一个名为Token
的自定义属性。我想在登录时用该令牌创建一个cookie。所以我需要调用一些函数,允许我从登录用户中获取Token
属性(通过UserManager或其他任何东西。它必须是登录的用户。)
我在互联网上搜索过,通过创建自定义工厂然后将其添加到startup.cs Like this找到了几个解决方案。但我无法找到或看到进入该物业的方法。 User.Identity.GetToken()
不起作用。
这是我的自定义工厂:
public class CustomUserIdentityFactory : UserClaimsPrincipalFactory<User, IdentityRole>
{
public CustomUserIdentityFactory(UserManager<User> userManager, RoleManager<IdentityRole> roleManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor)
{}
public override async Task<ClaimsPrincipal> CreateAsync(User user) {
var principal = await base.CreateAsync(user);
if(!string.IsNullOrWhiteSpace(user.Token)) {
((ClaimsIdentity)principal.Identity).AddClaims(new[] {
new Claim(ClaimTypes.Hash, user.Token)
});
}
return principal;
}
}
以下是我Startup.cs
services.AddScoped<IUserClaimsPrincipalFactory<User>, CustomUserIdentityFactory>();
所以,长话短说:我正在尝试访问自定义标识属性并找到了将其添加到UserManager的方法,但无法找到访问它的方法。
答案 0 :(得分:2)
您的“CustomUserIdentityFactory”向已登录用户添加声明,以便将声明添加到Cookie中,可以通过指定声明类型使用“User.Claims”进行访问。
假设您的声明类型为“http://www.example.com/ws/identity/claims/v1/token”
使用您自己的声明类型覆盖“CreateAsync”方法,更改以下代码。
public override async Task<ClaimsPrincipal> CreateAsync(User user) {
var principal = await base.CreateAsync(user);
var tokenClaimType = "http://www.example.com/ws/identity/claims/v1/token"
if(!string.IsNullOrWhiteSpace(user.Token)) {
((ClaimsIdentity)principal.Identity).AddClaims(new[] {
new Claim(tokenClaimType, user.Token)
});
}
return principal;
}
如何在"User.Claims"
var tokenClaimType = "http://www.example.com/ws/identity/claims/v1/token"
var token = User.Claims.Where(claim => claim.Type == tokenClaimType);
希望这有帮助。