カスタムクレームを含めるために、あなたは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作成したのは新しいリスト()です。 'HttpContext.Authentication.SignInAsync(user.SubjectId、user.Username、provider、props、additionalClaims.ToArray());を待つsampleseを見てください –
moritzg