我正在使用Identity Server 4,我已经自定义了我的ASP.NET Identity用户,如下所示:
public class ApplicationUser : IdentityUser
{
[MaxLength(100)]
public virtual string FirstName { get; set; }
[MaxLength(100)]
public virtual string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我无法看到我将Identity Server 4配置为在声明集合中包含这两个属性的位置.我已经查看了一些Identity Server 4示例,但看不到任何示例.
理想情况下,我希望将这两个用户属性映射到声明given_name和family_name声明.
我正在联系通知并查询userinfo端点(混合流?).所以我不确定这是Identity Server的配置还是userinfo端点的自定义?
小智 5
为了包含您的自定义声明,您需要GetProfileDataAsync()使用以下方法实现自己的方法IProfileService.每次请求用户声明时都会调用此方法.
这是我对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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你必须添加以下这一行 Startup.ConfigureServices()
services.AddScoped<IProfileService, CustomProfileService>();
| 归档时间: |
|
| 查看次数: |
1452 次 |
| 最近记录: |