炫意html5
最早CSS3和HTML5移动技术网站之一

identityserver4 scope 的问题

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

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

回答

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****();

炫意HTML5 » identityserver4 scope 的问题

Java基础教程Android基础教程