IdentityServer4-EF动态配置Client和对Claims授权(二)

2023-11-06 14:08

本文主要是介绍IdentityServer4-EF动态配置Client和对Claims授权(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节介绍Client的ClientCredentials客户端模式,先看下画的草图:

640?wx_fmt=png

一、在Server上添加动态新增Client的API 接口。

为了方便测试,在Server服务端中先添加swagger,添加流程可参考:https://www.cnblogs.com/suxinlcq/p/6757556.html 

在ValuesController控制器中注入ConfigurationDbContext上下文,此上下文可用来加载或配置IdentityServer4.EntityFramework的Client、身份信息、API资源信息或CORS数据等。

在ValuesController中实添加以下代码:

   private ConfigurationDbContext _context;           publicValuesController(ConfigurationDbContext context){_context = context;}

添加动态新增Client的API接口:

640?wx_fmt=png

控制器代码如下:

640?wx_fmt=png


 

二、对Server上的API进行保护

(1)安装IdentityServer4.AccessTokenValidation包

(2)在startup.cs中ConfigureServices方法添加如下代码:

640?wx_fmt=png

AddAuthentication把Bearer配置成默认模式,将身份认证服务添加到DI中。

AddIdentityServerAuthentication把IdentityServer的access token添加到DI中,供身份认证服务使用。

(3)在startup.cs中Configure方法添加如下代码:

640?wx_fmt=png

UseAuthentication将身份验证中间件添加到管道中,以便在每次调用主机时自动执行身份验证。

(4)在ValuesController控制器中添加[Authorize]

640?wx_fmt=png

 

(5)在项目属性->调试 中,启动浏览器,并设成swagger,如图:

640?wx_fmt=png

(6)启动项目,并调用第一个Get接口。

640?wx_fmt=png

显示Unauthorized(未授权),证明[Authorize]起作用了。


 

三、搭建Client客户端

(1)新建一个控制台程序,安装IdentityModel包

(2)添加类IDSHelper.cs,添加客户端请求API接口代码。

640?wx_fmt=png

(3)修改Program.cs代码,如下:

class Program{        static void Main(string[] args)       => IDSHelper.MainAsync().GetAwaiter().GetResult();}

(4)按Ctrl+F5,可以获取到access token和接口返回值

640?wx_fmt=png

复制token,用postman调用,成功获取到了接口返回值。

640?wx_fmt=png



 

四、测试动态新增Client接口

安装IdentityServer4包。

安装IdentityServer4.EntityFramework包。

在IDSHelper.cs类中添加Post方法:

640?wx_fmt=png

顺便把main中改成对Post调用:

static void Main(string[] args)       => IDSHelper.Post().GetAwaiter().GetResult();

按Ctrl+F5,调用新增Client的接口,并成功返回true。

640?wx_fmt=png

同时可以在数据库中的Client表找到相关记录。需要注意的是,不能添加相同Client ID的Client。


 

五、在Client中添加Claim信息,并在API接口中对Claim信息进行验证。

关于Claim的介绍可以看这篇文章:http://www.cnblogs.com/stulzq/p/8726002.html

这里把Claim简单当做用户的身份信息使用,修改Post方法里面的Client:

640?wx_fmt=png

可以看出,Claims为List,可以是很多个角色,这里只添加一个。

Ctrl+F5,运行成功添加superAdmin Client。

 

现在,需要对Server服务端的新增Client接口进行Claim身份验证,添加如下代码:

   [Authorize(Roles ="admin")]

640?wx_fmt=png

然后再客户端修改授权的账号为superadmin。

TokenClient tokenClient = new TokenClient(disco.TokenEndpoint, "superAdmin", "secret");

Ctrl+F5运行

640?wx_fmt=png

问题出现了,返回了Forbidden,没有权限进行访问。

这时候我们上官网查阅了资料,发现在添加Client的Claim时候,IdentityServer EntityFramework会为Claim的role添加一个默认前缀,为client_。所以,实际上它为client_role

而服务端只能对role进行验证。

此时我们需要把Claim的默认前缀去掉,设置为空ClientClaimsPrefix = "" 。 

去掉Server的Role验证,添加形如下面代码的Client。

640?wx_fmt=png

 Ctrl+F5,运行成功添加adminClient Client,这次的是Role为admin。

然后重新再Server服务端加上[Authorize(Roles ="admin")]

同时修改验证账号为adminClient。

TokenClient tokenClient = new TokenClient(disco.TokenEndpoint, "adminClient", "secret");

最后运行程序,成功地在[Authorize(Roles ="admin")]权限下访问并新增了Client。

640?wx_fmt=png


 

六、需要注意的问题

(1)新增Client到数据库时候,这里需要接收IdentityServer4.EntityFramework.Entities.Client

而不是IdentityServer4.Models.Client,否则API接口在接收和转化Client模型的时候会报错。

640?wx_fmt=png

(2)此外,本节介绍的Client的AllowedGrantTypes 都为 GrantTypes.ClientCredentials,相应的,客户端请求是,需要用RequestClientCredentialsAsync方法。

640?wx_fmt=png

最后再次提下,ClientCredentials模式的适用场景:用于和用户无关,服务与服务之间直接交互访问资源


 

Server服务端源码地址:https://github.com/Bingjian-Zhu/Server

Client客户端源码地址:https://github.com/Bingjian-Zhu/Client

相关文章:

  • 从Client应用场景介绍IdentityServer4(一)

  • 基于IdentityServer4 实现.NET Core的认证授权

  • IdentityServer4与ocelot实现认证与客户端统一入口

  • 使用Dapper持久化IdentityServer4

原文地址: https://www.cnblogs.com/FireworksEasyCool/p/10137011.html

 

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg


这篇关于IdentityServer4-EF动态配置Client和对Claims授权(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/357077

相关文章

SpringSecurity6.0 如何通过JWTtoken进行认证授权

《SpringSecurity6.0如何通过JWTtoken进行认证授权》:本文主要介绍SpringSecurity6.0通过JWTtoken进行认证授权的过程,本文给大家介绍的非常详细,感兴趣... 目录项目依赖认证UserDetailService生成JWT token权限控制小结之前写过一个文章,从S

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一