Identityserver4 使用identity server 4中的CustomTokenRequestValidationContext返回令牌响应中的用户角色

Identityserver4 使用identity server 4中的CustomTokenRequestValidationContext返回令牌响应中的用户角色,identityserver4,Identityserver4,我正在使用Identity Server 4.0和Identity Core,我需要用户角色以及令牌响应 由于违反了OAuth2协议,这不是正确的概念,需要修改IS4的内部结构 但您可以通过以下方式实现获取角色: -用户信息端点() -访问令牌 对于最后一个变量,您应该覆盖配置文件服务( 例如: public class MyProfileService : IProfileService { private readonly UserManager<User&g

我正在使用Identity Server 4.0和Identity Core,我需要用户角色以及令牌响应


由于违反了OAuth2协议,这不是正确的概念,需要修改IS4的内部结构

但您可以通过以下方式实现获取角色: -用户信息端点() -访问令牌

对于最后一个变量,您应该覆盖配置文件服务(

例如:

public class MyProfileService  : IProfileService
    {
        private readonly UserManager<User> _userManager;

        public MyProfileService(UserManager<User> userManager)
        {
            _userManager = userManager;
        }

        public async Task GetProfileDataAsync(ProfileDataRequestContext context)
        {
            var user = await _userManager.GetUserAsync(context.Subject);
            var roles = await _userManager.GetRolesAsync(user);

            var claims = new List<Claim>
            {
                new Claim(JwtClaimTypes.Email, user.Email),
                new Claim(JwtClaimTypes.GivenName, user.FirstName),
                new Claim(JwtClaimTypes.FamilyName, user.LastName),
                new Claim(JwtClaimTypes.Name, $"{user.FirstName} {user.LastName}"),
                new Claim(JwtClaimTypes.Locale, user.PreferredLanguage)
            };
            claims.AddRange(roles.Select(role => new Claim(JwtClaimTypes.Role, role)));

            context.IssuedClaims.AddRange(claims);
        }

        public Task IsActiveAsync(IsActiveContext context)
        {
            context.IsActive = true;
            return Task.CompletedTask;
        }
    }
公共类MyProfileService:IProfileService
{
私有只读用户管理器_UserManager;
公共MyProfileService(UserManager UserManager)
{
_userManager=userManager;
}
公共异步任务GetProfileDataAsync(ProfileDataRequestContext上下文)
{
var user=await\u userManager.GetUserAsync(context.Subject);
var roles=await\u userManager.GetRolesAsync(用户);
var索赔=新列表
{
新索赔(JwtClaimTypes.Email、user.Email),
新索赔(JwtClaimTypes.GivenName,user.FirstName),
新声明(JwtClaimTypes.FamilyName,user.LastName),
新声明(JwtClaimTypes.Name,$“{user.FirstName}{user.LastName}”),
新声明(JwtClaimTypes.Locale,user.PreferredLanguage)
};
claims.AddRange(roles.Select(role=>newclaims(JwtClaimTypes.role,role));
context.IssuedClaims.AddRange(索赔);
}
公共任务IsActiveAsync(IsActiveContext上下文)
{
context.IsActive=true;
返回Task.CompletedTask;
}
}
别忘了注册

            services.AddIdentityServer(options =>
            {
                ...
            })
            .AddProfileService<MyProfileService>()
services.AddIdentityServer(选项=>
{
...
})
.AddProfileService()