.NET Core微服务之基于IdentityServer建立授权与验证服务(续)

上一篇《.NET Core微服务之基于IdentityServer建立授权与验证服务》我们基于IdentityServer4建立了一个AuthorizationServer,并且继承了QuickStartUI,能够成功获取Token了。这一篇我们了解下如何集成API Service和MVC Web Application。

一、集成API Service

1.1 添加ASP.NET Core WebAPI项目

  新建两个WebAPI程序,假设这里取名为ApiService01(占用端口5010)和ApiService02(占用端口5020)。

  640?wx_fmt=png

  为了方便快速启动,可以继续在launchSettings.json中删掉关于IISExpress的部分,由于是WebAPI,所以也不需要启动浏览器(将其设为false):

640?wx_fmt=png

1.2 安装IdentityServer4.AccessTokenValidation

NuGet>Install-Package IdentityServer4.AccessTokenValidation  

  安装完成之后,需要做一些适配,所以我们来注册一下关于其的配置:这里设置的默认模式是Bearer,其中AddIdentityServerAuthentication方法是将我们上一篇创建的授权服务器注册为token的处理人,即在本API程序中涉及到token的处理,都会移交给指定服务器(这里即上一篇中创建的AuthorizationServer)进行处理。

640?wx_fmt=png

  配置文件中的内容如下所示:这里需要注意的是Name需要和我们在上一篇中的InMemoryConfiguration中自行hard-code的一样

640?wx_fmt=png

  此外,还需要在Configure方法中配置Authentication中间件:这里需要注意的就是需要放在UseMvc()之前调用

640?wx_fmt=png

  以上是ApiService01的配置,ApiService02的配置类似,只是配置文件中的信息从clientservice改为了productservice。

1.3 为要进行验证授权的方法添加[Authorize]特性

  由于我们创建WebAPI时,默认有一个ValuesController,保留它,我们直接为这个Controller添加一个[Authorize]特性。

    [Authorize][Route("api/[controller]")]    public class ValuesController : Controller{......}

  这样的话,刚刚注册的中间件就会在请求的过程中基于传递过来的token进行Authorization,如果没有token或者token是非法的,它就会告诉api的消费者这个请求时未授权的(HTTP StatusCode 401)

1.4 简单测试一下

  测试之前首先确保AuthorizationServer和两个ApiService都一起启动,可以在解决方案属性的启动选项中进行设置。

  (1)不带token的情况

  640?wx_fmt=png

  (2)带正确token的情况

  首先请求获取一下token:这里我们使用的grant_type是client_credentials,也可以使用password(需要输入用户名和密码)。

  640?wx_fmt=png

  带上这个token再去调用api service

  640?wx_fmt=png

  (3)带不正确的token的情况(这里简单改一下token的值)

  640?wx_fmt=png

  (4)用刚刚授予(clientservice)的token访问未经授权的productservice

  640?wx_fmt=png

  我们也可以通过在ValuesController中加上如下的一句,来获取Claims => 它是从已验证过的token中抽取的信息。如果我们将上面获取的token的grant_type设置为password的话,那我们会在Claims中获取到用户ID的信息。

  640?wx_fmt=png

  640?wx_fmt=jpeg

二、集成MVC Web Application

2.1 添加ASP.NET Core MVC项目

  新建一个ASP.NET Core MVC项目,这里假设取名为MvcClient(占用端口5100)

  仍然修改launchSettings.json,删掉IISExpress部分,但仍然选择启动浏览器:

640?wx_fmt=png

2.2 为指定方法添加[Authorize]特性

  这里我们在HomeController的About方法上面添加[Authorize]特性:

640?wx_fmt=png

  这时如果我们直接访问About,会抛异常,告知我们No authenticationScheme was specified......

  而我们想要的效果是当User第一次点击About,页面重定向到AuthorizationServer (localhost:5000),当用户登录验证授权之后,再重定向到该网站。此后一定时间范围内的第二次,第三次点击,都不再需要再重定向到AuthorizationServer,而是直接读取保存的token。

2.3 添加OpenID Connect Authentication

  这一部分主要集中于做Authentication(身份验证)而非Authorization(授权)。

640?wx_fmt=png

  这里我们使用的是implicit这个flow(详细内容可以阅读ddrsql的IdentityServer4之Implicit(隐式许可)),它主要用于客户端应用程序(主要指基于javascript的应用),它允许客户端程序重定向到AuthorizationServer,然后带着token重定向回来。值得一提的是这里的ResponseType为"id_token token",表示既获取id_token也获取access_token。而SaveTokens设为true则表示要将从AuthorizationServer返回的token持久化在cookie之中,这样就不用每次都去请求token了。

  当然,也还得在Configure方法中,配置Authentication中间件:

640?wx_fmt=png

  *.位置仍然需要在UseMvc之前。

2.4 在AuthorizationServer添加这个MvcClient

   在InMemoryConfiguration类中修改GetClients方法:

640?wx_fmt=png

  这里的ClientId要和MvcClient中设置的一致。RedirectUris是指登录成功之后需要重定向的地址(这里这个位置在MvcClient中),而PostLogoutRedirectUris是指登出之后需要重定向的地址。和API Service Client的设置不同的就是在AllowedScopes中给它增加了OpenId和Profile,因为我们为MvcClient设定的是oidc而不是bearer的模式。最后为了使用这些OpenID Connect Scopes,需要设置这些Identity Resources:

640?wx_fmt=png

  同时,为了演示方便,我们在MvcClient的About视图中添加几句:

640?wx_fmt=png

  这里我们将id_token, access_token(只有拿到access_token,才可以在MvcClient中发起请求调用API Service,而具体可以访问哪些API Service是在InMemoryConfiguration中配置的AllowScopes里面的那些)都显示出来,还会将Claims数据也显示出来(这里的Claims数据就是从AuthorizationServer返回的token里面payload部分的数据,关于payload请搜索JWT)

2.5 简单测试一下

  (1)未登陆的情况

  640?wx_fmt=gif

  拿到access_token,可以去JWT.io上进行解析看看:比如关注payload部分,可以得到很多信息,比如过期时间为1小时(默认)

  640?wx_fmt=png

  (2)已登录的情况

  这里为了方便演示,新增一个Logout方法:这里需要确保同时登出MvcClient的Cookies和OpenId Connect(即到Identity Server去清除单点登录的Session)。

640?wx_fmt=png

 640?wx_fmt=gif

  最后,关于access token的生命周期,可以阅读一下园友晓晨Master(李志强)的《IdentityServer4实战 - AccessToken 生命周期分析》,里面提到一个时间偏移的概念,需要了解一下。另外,如果是前后端分离的结构,也可以浏览一下ddrsql的《IdentityServer4之Implicit(隐式许可) —— oidc-client-js前后端分离》,里面介绍了oidc-client这个JS库的使用,以及如何支持跨域。

三、小结

  本篇基于上一篇搭建好的AuthorizationServer,通过集成API Service与MVC Web Application来演示他们如何与Authorization Server的交互,了解了两种不同的Scheme(Bearer和Implicit),最后补充了一些材料供扩展阅读。但是,IdentityServer的内容很多,我只是学习了一些我要掌握以做POC的部分,其他还有很多功能和知识点我没有学习,大家可以通过搜索园子里各种大神(eg.晓晨Master, solenovex等等等等)的文章进行学习。后面我会将IdentityServer与Ocelot进行集成,尝试在API网关处做统一验证与授权。最后,感谢参考资料的作者们,本篇主要基于参考资料的学习而成的笔记。另外,一些朋友十分想要一些基于生产环境的采坑经验以及更加实际的应用案例,对此我只能说声抱歉,我目前仍然处于学习与准备POC阶段,目的是为了在公司里推广以及给老板安利(虽然很难),还没有实际项目迁移到.NET Core微服务架构上去,但是如果不努力让公司迁移和应用,那像我司一样的传统行业的金融保险公司是不会主动升级的,还请各位谅解。

示例代码

  Click => https://github.com/EdisonChou/EDC.IdentityServer4.Demo

参考资料

《identityserver4官方文档》=> 重点关注那些流程图与术语

原文地址:

http://www.cnblogs.com/edisonchou/p/identityserver4_foundation_and_quickstart_02.html

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

640?wx_fmt=jpeg

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

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

相关文章

P4587-[FJOI2016]神秘数【主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P4587 题目大意 nnn个数,每次选择一个区间,然后询问这个区间的子集和所不能表示的最小的正整数。 解题思路 假设我们从小到大加入数字,我们发现如果这个数不是111显然这个区间内至少有一个…

【图论】【Floyed】舞会邀请(CODE[VS] 2604)

舞会邀请 CODE[VS] 2604 题目大意: Smart要叫一些人开Party,每个人可以通知一部分人,Smart去通知一些人,再让这些人去通知其他人,问Smart最少通知几个人,可以使全部人都被通知到 原题: 题目…

ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务

在大部分程序中一般都会需要用到后台任务, 比如定时更新缓存或更新某些状态。一、应用场景以调用微信公众号的Api为例, 经常会用到access_token,官方文档这样描述:“是公众号的全局唯一接口调用凭据,有效期目前为2个小…

【Floyed】工厂的烦恼(ssl 1762)

工厂的烦恼 ssl 1762 题目大意: 求一个图中最长的路线的长度 原题: Description 某工厂发现厂里的机器在生产产品时要消耗大量的原材料,也就是说,有大量的原材料变成了废物。因此厂里想找出消耗原材料最大的一条生产线路进行…

P3899-[湖南集训]谈笑风生【主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P3899 题目大意 给出nnn个点的一棵有根树,每次询问一个(p,k)(p,k)(p,k),求有多少个点对(b,c)(b,c)(b,c)满足 ppp和bbb是ccc的祖先bbb与ppp的距离不超过kkk 蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤…

好代码是管出来的——.Net中的代码规范工具及使用

上一篇文章好代码是管出来的——C#的代码规范介绍了编码标准中一些常用的工具,本篇就具体来介绍如何使用它们来完成代码管理。  本文主要内容有:Roslyn简介开发基于Roslyn的代码分析器常用的基于Roslyn的代码分析器在.Net Framework项目中使用代码分析…

NCPC2018 D.Delivery Delays[二分答案+DP check]

Delivery Delays 题意 100010001000个点,500050005000条边的无向图,披萨店在111号店.100010001000份披萨订单,每个订单有下单时间,送达地点,披萨制作出来的时间.你是快递员初始在111号点,每次可以拿无穷多披萨,送完以后返回111号点继续送,送餐的时候要求按照下单顺序送达,求等…

P6046-纯粹容器【数学期望,组合数】

正题 题目链接:https://www.luogu.com.cn/problem/P6046 题目大意 nnn个数,每次选择两个相邻的数删除小的那个,求每个数期望存活轮数。 解题思路 相当于一条链每次缩掉一条边,我们发现其实每个点只需要考虑左右第一个比它大的就好了。定义…

【dfs】病毒(jzoj 1284)

病毒 题目大意&#xff1a; 有n&#xff08;1<n<1000&#xff09;头奶牛&#xff0c;d&#xff08;1<d<15&#xff09;种病毒&#xff0c;每头奶牛身上有可能有很多种病毒病毒&#xff0c;每头奶牛挤出的牛奶是混在一起放的&#xff0c;问最多可以挤多少头奶牛的…

探讨.NET Core的未来

本文要点与传统的.NET Framework相比&#xff0c;.NET Core平台具有显著的性能优势。.NET Core在Microsoft平台之外也广为采用&#xff0c;并受益于强大的社区参与。.NET Core在设计上采用以服务器为中心&#xff0c;而非聚焦于Windows。.NET Core开发受益于这种设计。.NET Cor…

HDU5985 Lucky Conins 概率题

Lucky Conins 题意 最多共101010种硬币,所有的硬币之和不超过100000100000100000,每次将所有的硬币抛出,第iii中硬币正面朝上的概率为pip_ipi​,将反面朝上的硬币移除掉.直至最后剩一种硬币或没有硬币则停止.若最后剩余一种硬币,则称这种硬币是幸运的,求每种硬币的幸运概率. …

P6619-[省选联考2020A/B卷]冰火战士【树状数组二分】

正题 题目链接:https://www.luogu.com.cn/problem/P6619 题目大意 有火系战士和冰系战士有一个温度和一个战斗力&#xff0c;每次加入或删除一个战士&#xff0c;要求一个最大的kkk使得温度不低于kkk的火系战士战斗力和温度不高于kkk的冰系战士战斗力和的最小值最大。 解题思…

【数论】分数拆分

分数拆分 题目大意&#xff1a; 给出一个数k&#xff0c;问满足1/k1/x1/y且x>y的x,y有多少对 原题&#xff1a; 解题思路&#xff1a; 首先1k1x1y\frac{1}{k}\frac{1}{x}\frac{1}{y}k1​x1​y1​,变式为1k−1y1x\frac{1}{k}-\frac{1}{y}\frac{1}{x}k1​−y1​x1​,然后再…

.NET Core Community 第三个千星项目诞生:爬虫 DotnetSpider

DotnetSpider 至力于打造一个轻量化、高效率、易开发、可管理的一体化爬虫框架。它的核心要素是URL调度、基本的网页内容下载器、基于爬虫实体类的爬虫实现模式、常用数据库的支持、多线程的支持、状态的监控、运行日志、网页端管理。DotnetSpider 具有相当高的可定制性&#x…

Wannafly 挑战赛27 题解

Wannafly 挑战赛27 题目连接 https://www.nowcoder.com/acm/contest/215#question A.灰魔法师 题目 题解 考虑到可能的完全平方数只有400400400多个,因此对于每种数,直接暴力枚举所有的完全平方数计算一下就可以了. 代码 #include <iostream> #define int long lon…

【开源】OSharpNS,轻量级.net core快速开发框架发布

OSharpNS简介OSharp Framework with .NetStandard2.0&#xff08;OSharpNS&#xff09;是OSharp的以.NetStandard2.0为目标框架&#xff0c;在AspNetCore的现有组件 Microsoft.Extensions.DependencyInjection&#xff0c;Microsoft.Extensions.Configuration&#xff0c;Micro…

ATcoder-Replace Digits【线段树】

正题 题目链接:https://atcoder.jp/contests/abl 题目大意 nnn个数字开始全是111&#xff0c;要求支持 修改一个区间为一个数字&#xff08;是1∼91\sim 91∼9的数&#xff09;求所有数字串起来%998244353\%998244353%998244353 解题思路 其实就是第iii个数字乘上10i10^i10i…

【模拟】字符串展开

字符串展开 题目大意&#xff1a; 一串缩写的字符串&#xff0c;将它缩写前的输出来&#xff08;详情见原题&#xff09; 原题 解题思路&#xff1a; 直接模拟每一个字符即可 代码&#xff1a; #include<cstdio> #include<string> #include<cstring> #…

2018-2019 ACM—ICPC SEERC 题解

2018 - 2019 SEERC 题解 比赛发出来太新了,网上根本就搜不到题解,补题补的太难受了. 在这里分享一篇我自己写的题解,也方便别人补题. 题目链接 http://codeforces.com/gym/101964/attachments/download/7814/seerc-2018.pdf A.Numbers 不留坑,这题不会. B.Broken Watch 题解…

P6623-[省选联考2020A卷]树【Trie,树上启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/P6623 题目大意 一棵树&#xff0c;每个节点有一个权值valival_ivali​&#xff0c;定义disi,jdis_{i,j}disi,j​表示iii到jjj的距离。 一个节点xxx的权值定义为该节点子树中的每个节点yyy的disx,yvaljdis_{x,y}val_{j}disx…