使用 授权码模式 或 隐藏式 如何根据用户动态设置 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****();
scope 一般指的是整个API服务,你要控制用户权限可以控制claims ,判断polly