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

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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaFX UI控件教程(十八)之Progress Bar和Progress Indicator

翻译自 Progress Bar and Progress Indicator 在本章中&#xff0c;您将了解进度指示器和进度条&#xff0c;以及可视化JavaFX应用程序中任何操作进度的UI控件。 本ProgressIndicator类及其直接子类ProgressBar所提供的功能&#xff0c;以表明特定的任务是处理和检测是如何工…

你不知道ADo.Net中操作数据库的步骤【超详细整理】

1.先创建数据库连接字符串&#xff1a; string strcon "Data Source.;Initial CatalogschoolDB;Integrated SecurityTrue";2.创建SqlConnection对象&#xff0c;需要注意的是SqlConnection对象在using System.Data.SqlClient;命名空间中。 SqlConnection conn new…

C# 7.2和8.0路线图

C# 7.2和8.0的许多新功能已经列入了计划&#xff0c;其中包括空引用类型和有限形式的多重继承。 只读引用和只读结构体 [7.2原型] 首先提到的是只读引用和结构体。简单来讲&#xff0c;这项特性使得C#能够使用类似const的参数来提高性能。像我们所知道的“ref只读参数”和简单…

MyBatis中的原理

01Mybatis的运行原理 运行过程中涉及到的类 1.1 Resources MyBatis中IO流的工具类 1.1 加载配置文件 1.2 SqlSessionFactoryBuilder() 构建器 1.2.1 作用:创建SqlSessionFactory接口的实现类 1.3 XMLConfigBuilder MyBatis全局配置文件内容构建器类 1.3.1 作用负责读取流内容并…

JavaFX UI控件教程(十九)之Hyperlink

翻译自 Hyperlink 本章介绍Hyperlink用于将文本格式化为超链接的控件。 所述Hyperlink类表示另一种类型的Labeled控制。图18-1演示了默认超链接实现的三种状态。 图18-1超链接控制的三种状态 创建超链接 示例18-1中显示了生成超链接的代码片段。 例18-1典型的超链接 Hype…

杨辉三角形

package com.wdl.day07;/*** 创建人 wdl* 创建时间 2021/8/8* 描述*/ public class YangHuiTest {public static void main(String[] args) {int[][] yanghui new int[10][];for (int i 0; i < yanghui.length; i) {yanghui[i] new int[i 1];yanghui[i][0] 1;yanghui[i…

致我们最最最最最最最最最最最最最优秀的班主任——王老师

今天不说java&#xff0c;也不表C#&#xff0c;只来叙叙我们最最最最最最最最最最最最最优秀的班主任————王老师。亲爱的王老师&#xff0c;一起为3班孩子们的学业共同努力而使我倍感荣幸。回想从我们班报道以来&#xff0c;大大小小的各种奖状铺满那墨绿黑板的右侧&#x…

Asp.Net Core 发布到IIS

一、Asp.Net Core 发布到IIS 1.许多时候在WindowsServer服务器上已经安装了IIS&#xff0c;监听80端口&#xff0c;那么Asp.Net Core应用的自宿主就没法监听80端口 2.也就是在Widnows系统已经启用IIS服务的情况下&#xff0c;需要安装 NET Core Windows Server Hosting&#…

JavaFX UI控件教程(二十)之HTML Editor

翻译自 HTML Editor 在本章中&#xff0c;您将学习如何使用嵌入式HTML编辑器编辑JavaFX应用程序中的文本。 该HTMLEditor控件是一个功能齐全的富文本编辑器。它的实现基于HTML5的文档编辑功能&#xff0c;包括以下编辑功能&#xff1a; 文本格式包括粗体&#xff0c;斜体&am…

使用layui弹框实现添加时,当添加成功之后如何进行关闭当前窗口刷新父页面的数据

一看标题可能大家都比较模糊&#xff0c;我就去特意做了一个gif的演示图&#xff0c;结果发现太小了&#xff0c;就改成了现在的视频&#xff0c;视频地址&#xff1a; 使用layui实现对数据的增删改查演示案例实现技术是&#xff1a;ssh框架layui表格&#xff0c;即简单的对单表…

IdentityServer4 SigningCredential(RSA 证书加密)

IdentityServer4 默认提供了两种证书加密配置&#xff1a; services.AddIdentityServer().AddDeveloperSigningCredential().AddTemporarySigningCredential(); 这两种证书加密方式&#xff0c;都是临时使用&#xff0c;每次重启项目的时候&#xff0c;都会重新生成一个新的证…

JavaFX UI控件教程(二十一)之Tooltip

翻译自 Tooltip 在本章中&#xff0c;您将了解工具提示&#xff0c;即当鼠标光标悬停该控件时&#xff0c;可以为任何UI控件设置的控件。 的Tooltip类表示通常用于显示关于所述用户接口的控制附加信息的公共UI组件。可以通过调用setTooltip方法在任何控件上设置工具提示。 …

layui如何实现添加数据时关闭页面层,并实时刷新表格数据?

可能看到标题的你没有明白我到底想表达啥&#xff1f;&#xff08;我起名字时删改多遍&#xff0c;这是最终定下来的&#xff09;&#xff0c;不过&#xff0c;为了让大家看的明白&#xff0c;我专门去做了个演示视频&#xff1a;演示案例使用的技术&#xff1a;ssh框架layui表…

.net core 集成 autofac

1. Install Install-Package AutofacInstall-Package Autofac.Extensions.DependencyInjection 2.Startup 2.1 增加成員 public IContainer ApplicationContainer { get; private set; } 2.2 Startup.ConfigureServices 返回值改為&#xff1a;IServiceProvider 末尾中增…

JavaFX UI控件教程(二十三)之Menu

翻译自 Menu 本章介绍如何创建菜单和菜单栏&#xff0c;添加菜单项&#xff0c;将菜单分组&#xff0c;创建子菜单以及设置上下文菜单。 您可以使用以下JavaFX API类在JavaFX应用程序中构建菜单。 菜单栏 菜单项 菜单 CheckMenuItem RadioMenuItem 菜单 CustomMenuItem…

利用bootstraptable展示数据,对数据进行排序分页等操作

今天分享一下bootstraptable的相关技能点&#xff0c;由于第一次接触&#xff0c;所以刚开始碰了好多壁&#xff0c;于是趁现在过去不久&#xff0c;先总结总结。 Bootstraptable简单的来说就是一个表格控件&#xff0c;但是这个表格可不是一般的表格&#xff0c;分页、排序、…

JavaFX UI控件教程(二十四)之Password Field

翻译自 Password Field 在本章中&#xff0c;您将了解另一种类型的文本控件&#xff0c;即密码字段。 本PasswordField类实现一个专门的文本字段。通过显示回显字符串来隐藏用户键入的字符。图23-1显示了一个密码字段&#xff0c;其中包含提示消息。 图23-1带有提示消息的密…

3分钟内看完这,bootstraptable表格控件,受益匪浅!

今天分享一下bootstraptable的相关技能点&#xff0c;由于第一次接触&#xff0c;所以刚开始碰了好多壁&#xff0c;于是趁现在过去不久&#xff0c;先总结总结。Bootstraptable简单的来说就是一个表格控件&#xff0c;但是这个表格可不是一般的表格&#xff0c;分页、排序、查…

微软Azure开源开发者(深圳)峰会等你来

微软开发技术与云平台自从迈向开放、开源、跨平台的转型以来&#xff0c;已经受到全球开源社区们的关注。 从 Github 上高居世界首位的开源项目贡献数量&#xff0c;可以看到微软贯彻开源战略的实际行动。另一方面&#xff0c;微软也主动与开源社区做密切的技术交流。 本次 Azu…

这个点名系统太好用了,快来看看……

声明&#xff1a;软件为本人原创&#xff0c;后台回复&#xff1a;随机点名系统&#xff0c;免费下载。大家好&#xff0c;我是雄雄&#xff0c;昨天公众号给大家分享了windows系统和office办公软件激活的方法&#xff0c;正中好多粉丝的下怀。【原文在这里】今天在给大家分享一…