为了包括您的自定义声明,您需要实现使用IProfileService
自己GetProfileDataAsync()
方法。每次请求用户声明时都会调用此方法。
这是我的IProfileService实现。
public class CustomProfileService : IProfileService
{
private readonly UserManager<User> _userManager;
public CustomProfileService(UserManager<User> userManager)
{
_userManager = userManager;
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var subjectId = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(subjectId);
if (user == null) return;
var claims = new List<Claim>
{
new Claim("username", user.UserName),
new Claim("email", user.Email),
new Claim("firstname", user.FirstName),
new Claim("lastname", user.LastName)
};
var roles = await _userManager.GetRolesAsync(user);
foreach (var role in roles)
{
claims.Add(new Claim("role", role));
}
var userClaims = await _userManager.GetClaimsAsync(user);
foreach (var userClaim in userClaims)
{
claims.Add(new Claim(userClaim.Type, userClaim.Value));
}
context.IssuedClaims = claims;
}
public async Task IsActiveAsync(IsActiveContext context)
{
var user = await _userManager.FindByIdAsync(context.Subject.GetSubjectId());
context.IsActive = user.IsActive;
}
}
然后,你将不得不这样添加下面一行到Startup.ConfigureServices()
services.AddScoped<IProfileService, CustomProfileService>();
谢谢你,在哪里呢'additionalClaims'从何而来,它不是在我的方法或控制器声明? –
@AdrianThompsonPhillips这只是一个'新清单()'我创建的。看看在哪里'await HttpContext.Authentication.SignInAsync(user.SubjectId,user.Username,provider,props,additionalClaims.ToArray());'被称为 –
moritzg