IdentityServer4 授权配置AllowedScopes实例
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
,现在就会出现两种情况:
前台
Client
和后台Client
,都需要授权后访问api/values
接口:没有问题。前台
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 对象,设置不同的 rolecontext.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 claimnew 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 授权配置AllowedScopes实例的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

当我们不想要继续使用当前的win10企业版2016长期服务版的时候可以选择切换成专业版,方法也很简单,只需要改一些内容然后进行系统镜像的安装就可以了。win10企业版2016长期服务版怎么改专业版1、按下win+R,然后输入“regedit”2、直接在上面的地址栏里面粘贴下面的这个路径:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion3、然后找到EditionID,将里面的内容替换成“professional”确

如何使用Flask-Security实现用户认证和授权引言:在现代的Web应用程序中,用户认证和授权是必不可少的功能。为了简化这个过程,Flask-Security是一个非常有用的扩展,它提供了一系列工具和功能,使用户认证和授权变得简单而便捷。本文将介绍如何使用Flask-Security来实现用户认证和授权。一、安装Flask-Security扩展:在开始

UniApp实现用户登录与授权的细节解析在现代移动应用开发中,用户登录和授权是必不可少的功能。UniApp作为一个跨平台的开发框架,提供了一种方便的方式来实现用户登录和授权。本文将探讨UniApp中实现用户登录和授权的细节,并附上相应的代码示例。一、用户登录功能的实现创建登录页面用户登录功能通常需要一个登录页面,该页面包含用户输入账号和密码的表单以及登录按钮

抖音,作为当下热门的社交媒体平台,不仅为人们提供了丰富的娱乐内容,也成为了众多品牌和商家推广产品、实现销售的重要渠道。其中,抖音切片带货成为了一种新颖且高效的营销方式。那么,抖音切片带货怎么拿授权呢?一、抖音切片带货怎么拿授权?抖音切片带货是将长视频分解成短视频片段,并在其中嵌入商品推广信息,以吸引观众购买。在抖音上进行切片带货,首要步骤是取得原视频的授权。在寻找合适的授权方时,您可以考虑利用抖音平台、社交媒体及行业论坛等多种途径。寻找具有热门视频内容的创作者或版权所有者,并积极与他们建立联系,

如何使用JWT在PHP应用中实现身份验证和授权引言:随着互联网的快速发展,身份验证和授权在Web应用程序中变得日益重要。JSONWebToken(JWT)是一种流行的认证和授权机制,它在PHP应用中广泛应用。本文将介绍如何使用JWT在PHP应用中实现身份验证和授权,并提供代码示例,帮助读者更好地理解JWT的使用方法。一、JWT简介JSONWebTo

随着Web应用程序的广泛使用,安全性和数据保护已经成为Web应用程序开发的一个重要问题。为了确保Web应用程序的安全性,需要进行用户身份验证和授权。Flask作为一个流行的Web开发框架,提供了很多用于实现用户身份验证和授权的机制。用户身份验证用户身份验证是指在用户访问Web应用程序的时候,通过一定的身份验证方式来确定用户的身份是否合法。Flask提供了很多

有很多正版软件为了维护自己的知识产权,用户在用软件之前,要通过一些授权,经过开发者的准许才能使用。有的软件有体验期,过了这个期限,就要重新获得授权才能正常使用。如果wps提示授权到期,我们是无法进行任何操作的。怎么解决这个问题,一起来看看下边的讲解。1、我打开的是WPS文字程序,点击如上图红框位置,如下图所示。 2、点击配置和修复工具。 3、选择“高级”,如下图所示。 4、单击产品管理中心,删除“已过期”提示内容,如下图所示。 5、点击“添加”后,输入序列号,如下图所示。 6、然后首先

如何通过Webman框架实现用户认证和授权功能?Webman是一款基于Python的轻量级Web框架,它提供了丰富的功能和灵活的扩展性。在开发中,用户认证和授权是非常重要的功能,本文将介绍如何使用Webman框架实现这些功能。安装Webman首先,我们需要安装Webman。可以使用pip命令来安装:pipinstallwebman初
