首页 新闻 会员 周边

identityserver4 scope 的问题

0
悬赏园豆:15 [已解决问题] 解决于 2021-07-22 22:26

使用 授权码模式 或 隐藏式 如何根据用户动态设置 scope ,生成 token?

例如:有 admin(管理员) 和 author (作者)2个用户。admin 具有 用户资源管理权限、文章资源管理权限,author 只有 文章资源管理权限,2用户共用一个 Client。
如何在用户登录成功后动态添加 scope ?

暗夜余晖的主页 暗夜余晖 | 初学一级 | 园豆:124
提问于:2021-04-12 18:02
< >
分享
最佳答案
0

1.你需要定义 用户资源管理权限、文章资源管理权限 2个scope。
2.client 的 AllowedScopes 包含这两个scope。
3.定义 IResourceOwnerPasswordValidator扩展或者IProfileService(根据你的授权模式决定)。根据用户role,加入对应的scope。
IResourceOwnerPasswordValidator 示例代码:

        public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
        {
            var user = await _loginService.FindLoginUserAsync(context.UserName, context.Password);
            if (user == null)
            {
                _logger.LogDebug($"can't find login user by username:{context.UserName}");
                context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "invalid custom credential");
            }
            else
            {
                //调用此方法以后内部会进行过滤,只将用户请求的Claim加入到 context.IssuedClaims 集合中 这样我们的请求方便能正常获取到所需Claim

                //验证通过返回结果 
                //subjectId 为用户唯一标识 一般为用户id
                //authenticationMethod 描述自定义授权类型的认证方法 
                //authTime 授权时间
                //claims 需要返回的用户身份信息单元 此处应该根据我们从数据库读取到的用户信息 添加Claims 如果是从数据库中读取角色信息,那么我们应该在此处添加 此处只返回必要的Claim
                var claims = _loginService.GetClaims(user);
                context.Result = new GrantValidationResult(
                    user.Id.ToString(),
                    OidcConstants.AuthenticationMethods.Password, DateTime.UtcNow, claims);
            }
            await Task.CompletedTask;
        }

IdentityServer4 配置

            services.AddIdentityServer()
                .AddResourceOwnerValidator<AppResourceOwnerPasswordValidator>()
                .Add****();

收获园豆:10
gt1987 | 小虾三级 |园豆:1150 | 2021-04-19 14:52
其他回答(1)
0

scope 一般指的是整个API服务,你要控制用户权限可以控制claims ,判断polly

收获园豆:5
diudiu1 | 园豆:1031 (小虾三级) | 2021-04-12 18:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册