我正在使用 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; }
}
我看不到在哪里配置 Identity Server 4 以将这两个属性包含在声明集合中。我查看了一些 Identity Server 4 示例,但没有看到任何示例。
理想情况下,我希望将这两个用户属性映射到given_name
and family_name
claims.
我目前正在连接通知并查询userinfo
端点(混合流?)。所以我不确定这是否是 Identity Server 的配置或自定义userinfo
终点?
为了包含您的自定义声明,您需要实施您自己的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;
}
}
然后你必须将以下行添加到Startup.ConfigureServices()
services.AddScoped<IProfileService, CustomProfileService>();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)