上一篇《.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)。

  

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

1.2 安装IdentityServer4.AccessTokenValidation

NuGet>Install-Package IdentityServer4.AccessTokenValidation  

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

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

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

  以上是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的情况

  

  (2)带正确token的情况

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

  

  带上这个token再去调用api service

  

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

  

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

  

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

  

  

二、集成MVC Web Application

2.1 添加ASP.NET Core MVC项目

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

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

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

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

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

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

2.3 添加OpenID Connect Authentication

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

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

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

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

2.4 在AuthorizationServer添加这个MvcClient

  在InMemoryConfiguration类中修改GetClients方法:

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

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

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

2.5 简单测试一下

  (1)未登陆的情况

  

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

  

  (2)已登录的情况

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

 

  最后,关于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官方文档》=> 重点关注那些流程图与术语

  • solenovex,《学习Identity Server4的预备知识》

  • solenovex,《使用Identity Server 4建立Authorization Server (1)》

  • solenovex,《使用Identity Server 4建立Authorization Server (2)》

  • solenovex,《使用Identity Server 4建立Authorization Server (3)》

  • 使用Identity Server 4建立Authorization Server (4)

  • 使用Identity Server 4建立Authorization Server (5)

  • Identity Service - 解析微软微服务架构eShopOnContainers(二)

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

  • IdentityServer4 指定角色授权(Authorize(Roles="admin"))

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

  • IdentityServer4 SigningCredential(RSA 证书加密)

  • IdentityServer4 实现自定义 GrantType 授权模式

  • IdentityServer4 配置负载均衡

  • IdentityServer4使用教程1--搭建ID4网站

  • IdentityServer4(10)- 添加对外部认证的支持之QQ登录

  • IdentityServer4 第三方快速入门和示例

原文地址:

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

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

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

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

    一.IdentityServer的预备知识 要学习IdentityServer,事先得了解一下基于Token的验证体系,这是一个庞大的主题,涉及到Token,OAuth&OpenID,JWT, ...

  2. ASP.NET Core 2.1中基于角色的授权

    授权是来描述用户能够做什么的过程.例如,只允许管理员用户可以在电脑上进行软件的安装以及卸载.而非管理员用户只能使用软件而不能进行软件的安装以及卸载.它是独立的而又与验证配合使用,需要身份验证机制.对于 ...

  3. 使用内存数据库的.NET Core 3.0中基于身份(Identity-Based)的身份验证

    目录 介绍 背景 先决条件 创建Web应用程序的步骤 第1步 第2步 第3步 第4步 第5步 第6步 运行您的应用程序 总结 下载源9.5 MB 介绍 身份验证是根据系统或用户的身份确定或给予其个人访 ...

  4. .NET Core微服务系列基础文章索引(目录导航Final版)

    一.为啥要总结和收集这个系列? 今年从原来的Team里面被抽出来加入了新的Team,开始做Java微服务的开发工作,接触了Spring Boot, Spring Cloud等技术栈,对微服务这种架构有 ...

  5. 基于微信企业号的校园服务器,基于微信企业号的校园移动服务.doc

    基于微信企业号的校园移动服务.doc 基于微信企业号的校园移动服务 摘 要 以微信为代表的即时通信软件,打破了时间.空间的限制,集社交.传播和教育等功能为一体,在信息技术的推动下成为新型的教育方式并被 ...

  6. 服务监管框架下的 IT 运维服务与绩效管理体系建设案例

    公众号回复:干货,领取价值58元/套IT管理体系文档 公众号回复:ITIL教材,领取最新ITIL4中文教材 正文 一. 对客户需求与服务现状的调研和分析 任何服务质量的改进都是源于对客户需求的高度关注 ...

  7. 手机短信验证服务,为个人信息安全提供保障

    近年来,随着科技的不断创新与进步,电子商务网站已经成为了人们日常生活中不可缺少的一部分.与传统商务模式相比,电子商务的确有着其无可比拟的巨大优势,随着电子商务的不断兴盛,也衍生了许许多多的新兴服务产业 ...

  8. .NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.案例结构总览 这里,假设我们有两个客户端(一个Web网站,一个移动App),他们要使用系统,需要通过API网关(这里API网关始终作为 ...

  9. .NET Core微服务之路:基于Ocelot的API网关实现--http/https协议篇

    前言 最近一直在忙公司和私下的兼职,白天十个小时,晚上四个小时,感觉每天都是打了鸡血似的,精神满满的,连自己那已经学打酱油的娃都很少关心,也有很长一段时间没有更新博客了,特别抱歉,小伙伴们都等得想取关 ...

最新文章

  1. gridsearchcv参数_使用python进行模型参数调优
  2. (转) Java线程同步阻塞, sleep(), suspend(), resume(), yield(), wait(), notify()
  3. css 中图片旋转,倾斜,位移,平滑
  4. mysql 关联查询_Mysql查询优化器,再也不会因为该什么时候建立索引发愁了
  5. Eclipse与github整合完整版
  6. 遵义大数据中心项目工程概况_市委书记张新文到曹州云都大数据中心等项目现场调研建设情况...
  7. gateway 车辆网关
  8. 将一个项目中的图片存到另一个项目中_复盘一个Smart200小项目(2)
  9. ExtJs - grid 合并单元格 跨行跨列
  10. linux下监控某个目录是否被更改
  11. Tomcat SSL Configuration
  12. 【数学建模】基于matlab重庆三号线地铁运行仿真【含Matlab源码 042期】
  13. centos 计算器_在Linux命令行中使用计算器的5个命令
  14. 使用Simscape搭建车辆仿真模块
  15. [matlab]简单的线性拟合以及作图
  16. http转https后资源加载不显示
  17. 关于ubuntu 系统chromium浏览器启用AdobeFlashPlayer
  18. iOS 提交app错误 90096解决办法
  19. 怎样利用DOI快速检索文献?
  20. 【Java余元面向对象】(23)抽象方法/抽象类

热门文章

  1. 解决在Python中使用Win32api报错的问题,No module named win32api
  2. 亿方云CEO程远:转型第一式:链接企业人与数据
  3. CSS属性总结之background
  4. 关于Activity的getReferrer():如何在Activity中获取调用者?
  5. 新款ATM恶意软件Alice 可对抗动态分析 但目前需要物理接触主机
  6. Mysql安装及自动化部署脚本方案
  7. C++的enum hack
  8. Redis主从持久化测试
  9. DBDesigner 4 与 MySql 5 不能连接主要是驱动的原因
  10. 用啥Selenium?! .NET程序员就用自家的Playwright for .NET