1. 业务场景

IdentityServer4 授权配置Client中的AllowedScopes,设置的是具体的 API 站点名字,也就是使用方设置的ApiName,示例代码:

//授权中心配置new Client{    ClientId = "client_id_1",    AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,    AllowOfflineAccess = true,    AccessTokenLifetime = 3600 * 6, //6小时    SlidingRefreshTokenLifetime = 1296000, //15天    ClientSecrets =    {        new Secret("secret".Sha256())    },    AllowedScopes =     {        "api_name1"    },}

//API 服务配置app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions{    Authority = $"http://localhost:5000",    ApiName = "api_name1",    RequireHttpsMetadata = false});

上面两个api_name1配置要一致,问题来了,因为授权中心的scope配置是整个 API 服务,如果我们存在多个Client配置,比如一个前台和后台,然后都需要访问api_name1,就会出现一些问题。

比如,api_name1服务中的一个接口服务配置代码:

[Authorize()]
[Route("api/values")]
[HttpGet]public IActionResult Get(){    return Ok();
}

Authorize()的配置,说明api/values接口需要授权后访问,如果授权中心配置了两个Client(前台和后台),并且scope都包含了api_name1,现在就会出现两种情况:

  1. 前台Client和后台Client,都需要授权后访问api/values接口:没有问题。

  2. 前台Client不需要授权后访问,后台Client需要授权后访问:有问题,前台Client没办法访问了,因为api/values接口设置了Authorize()

其实,说明白些,就是该如何让 API 服务指定Client授权访问?比如:[Authorize(ClientId = 'client_id_1')]

2. 解决方案

没有[Authorize(ClientId = 'client_id_1')]这种解决方式,不过可以使用[Authorize(Roles = 'admin')]

授权中心的ResourceOwnerPasswordValidator代码,修改如下:

public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator{    private readonly IUserService _userService;

    public ResourceOwnerPasswordValidator(IUserService userService)    {        _userService = userService;    }

    public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)    {        var user = await _userService.Login(context.UserName, context.Password);        if (user != null)        {            var claims = new List<Claim>() { new Claim("role", "admin") }; //根据 user 对象,设置不同的 role            context.Result = new GrantValidationResult(user.UserId.ToString(), OidcConstants.AuthenticationMethods.Password, claims);        }    }}

授权中心的startup配置,修改如下

var builder = services.AddIdentityServer();builder.AddTemporarySigningCredential()        //.AddInMemoryIdentityResources(Config.GetIdentityResources())        .AddInMemoryApiResources(new List<ApiResource>        {            new ApiResource("api_name1", "api1"){ UserClaims = new List<string> {"role"}}, //增加 role claim            new ApiResource("api_name2", "api2"){ UserClaims = new List<string> {"role"}}        })        .AddInMemoryClients(Config.GetClients());

API 服务接口,只需要配置如下:

[Authorize()][Route("api/values")][HttpGet]public IActionResult Get(){    return Ok();}

[Authorize(Roles = "admin")][Route("api/values2")][HttpGet]public IActionResult Get2(){    return Ok();}

[Authorize(Roles = "admin,normal")][Route("api/values3")][HttpGet]public IActionResult Get3(){    return Ok();}

需要注意的是,api/values接口虽然没有设置具体的Roles,但每个Role都可以访问。

相关文章:

  • IdentityServer4(OAuth2.0服务)折腾笔记

  • IdentityServer4 实现 OpenID Connect 和 OAuth 2.0

  • IdentityServer4 使用OpenID Connect添加用户身份验证

  • IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

原文地址:http://www.cnblogs.com/xishuai/p/identityserver4-apiresource-userclaim-role-authorize.html

.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

IdentityServer4 指定角色授权(Authorize(Roles=amp;quot;adminamp;quot;))相关推荐

  1. Asp.Net Core 中IdentityServer4 实战之角色授权详解

    一.前言 前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式,最近由于改造一个网关服务,也用到了IdentityServer4的授权,改造过程中发现比较适合基于Role ...

  2. Spring Security:基于内存的角色授权

    本文来说下Spring Boot+Spring Security:基于内存的角色授权 文章目录 概述 需求缘起 编码思路 基于内存的角色授权 为用户配置角色 开启Spring方法级安全 配置方法级拥有 ...

  3. RDIFramework.NET V3.3 Web版角色授权管理新增角色对操作权限项、模块起止生效日期的设置...

    在实际应用在我们可能会有这样的需求,某个操作权限项(按钮)或菜单在某个时间范围内可以让指定角色访问.此时通过我们的角色权限扩展设置就可以办到. 在我们框架V3.3 Web版本全新增加了角色权限扩展设置 ...

  4. .NET快速信息化系统开发框架 V3.2-amp;gt;WinForm版本新增新的角色授权管理界面效率更高、更规范...

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chinahuyong/article/details/76735793 角色授权管理模块主要是对角色 ...

  5. Jenkin权限控制——基于角色授权策略

    开启授权策略 Jenkins的项目权限控制通过[授权策略]实现,[授权策略]需要plugins提供,首先需要安装Role-based Authorization Strategy 安装Role-bas ...

  6. Kubernetes RBAC 为指定用户授权访问不同命名空间权限

    在开启了 TLS 的集群中,每当与集群交互的时候少不了的是身份认证,使用 kubeconfig(即证书) 和 token 两种认证方式是最简单也最通用的认证方式. 以kubectl为例介绍kubeco ...

  7. CSP 202206 题解:归一化处理,寻宝大冒险,角色授权,光线追踪,PS无限版

    试题内容请前往CCF官网查看: CCF-CSP计算机软件能力认证考试 http://118.190.20.162/home.page 阅读本题解前,您应当了解下列知识: 线段树 教程 C++ 标准库( ...

  8. Flowable快速工作流脚手架_Jsite角色授权不显示

    JSite 快速开发框架,内置Flowable工作流引擎 · 五大基础模块 · 前后端基础代码自动生成 · 权限精确控制. 说明:此版本我已经调通,最新版本正在更新,页面未处理好,因此采用历史版本. ...

  9. 信锐无线角色授权详细步骤

    一.无线初级课程实验 1.1 角色授权实验 [实验环境] 1.任意型号 NAP 1 台 [实验内容] 1.搭建一个本地转发的无线网络,对无线终端进行访问控制.流量时长限制.限速. 访问控制策略: 第一 ...

最新文章

  1. LeetCode简单题之交替位二进制数
  2. php上传文件自动删除,jsp-解决文件上传后重启Tomcat时文件自动删除问题
  3. mongoose 批量修改字段_WordPress图片路径批量替换方法
  4. 金文学何许人也的即时通讯
  5. java 0xf0_java 中类似js encodeURIComponent 函数的实现案例
  6. DPlayer播放器本地化P2P解析加速版源码
  7. ‘cross-env‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  8. eclipse中使用maven插件的时候,运行tomcat7:run的时候报错
  9. 09 WebGL通过uniform变量修改点的颜色
  10. 神经网络拓扑图怎么画,神经网络和图神经网络
  11. WordPress插件曝出零日漏洞,已被积极在野利用
  12. c语言最近点对问题(4个点)-分治法递归
  13. 嵌入式linux程序加密,基于嵌入式操作系统uClinux实现网络安全加密系统的设计
  14. python代码风格程序越复杂越高级_Python中代码风格的改变和相应的性能优化
  15. 数据分析(一)- 数据分析基础及matplotlib
  16. 破茧成蝶——我的北大之路(文/贺舒婷)
  17. ipv4v6双栈技术_IPv6过渡技术之双栈技术
  18. 网站制作中 电脑网站与手机网站有哪些区别?
  19. Java中的 分号 ;
  20. php中in的作用是什么,in是什么软件

热门文章

  1. C# aspx页面动态加载ascx用户控件 及 利用反射调用其内方法
  2. NHibernate for .NET 1.2
  3. Avalonia跨平台入门第二十二篇之人脸检测
  4. .Net Core with 微服务 - Consul 注册中心
  5. 通过Dapr实现一个简单的基于.net的微服务电商系统
  6. 如何看待 70% 的程序员,缺乏数据结构和算法知识?
  7. .NET Core 使用Topshelf方式创建Windows服务
  8. Kubernetes 1.20 发布:妙啊
  9. eShopOnContainers 知多少[12]:Envoy gateways
  10. Kubernetes的安全性怎么解?从4个方面为你列出方案清单