首页 > 解决方案 > 使用身份服务器 4 中的 CustomTokenRequestValidationContext 在令牌响应中返回用户角色

问题描述

我正在使用带有 Identity Core 的 Identity Server 4.0,我需要用户角色和令牌响应。

下面附上图片供参考

标签: identityserver4

解决方案


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

但是您可以实现从以下位置获取角色: - 用户信息端点 ( http://docs.identityserver.io/en/3.1.0/endpoints/userinfo.html ) - 访问令牌

对于最后一个变体,您应该覆盖配置文件服务 ( http://docs.identityserver.io/en/3.1.0/reference/profileservice.html)|

例如:

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;
        }
    }

别忘了注册

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

推荐阅读