如果使用 IdentityServer4 做授权服务的负载均衡,默认情况下是不可以的,比如有两个授权服务站点,一个资源服务绑定其中一个授权服务(Authority配置),如果通过另外一个授权服务获取access_token,然后拿这个access_token去访问资源服务,会报 401 未授权错误,为什么?原因在这:

By default an access token will contain claims about the scope, lifetime (nbf and exp), the client ID (client_id) and the issuer name (iss).

归纳一下,生成access_token受影响的因素:

  • scope(授权范围):服务包含在 scope 内,生成的access_token,才能访问本服务。
  • lifetime(生命周期):过期的access_token,无效访问。
  • client ID (client_id):不同的客户端 ID,生成不同对应的access_token
  • issuer name (iss):翻译过来“发行者名称”,类似于主机名。
  • RSA 加密证书(补充):不同的加密证书,生成不同对应的access_token

要让负载均衡下的两个授权服务,可以正常使用的话,需要确保两台授权服务以上五种因素完全一致,除了 issuer name (iss),其他因素都是一样的。

IdentityServer4 怎么设置 issuer name (iss)呢?答案是通过IssuerUri

  • IssuerUri:Set the issuer name that will appear in the discovery document and the issued JWT tokens. It is recommended to not set this property, which infers the issuer name from the host name that is used by the clients, If not set, the issuer name is inferred from the request.

说明中不建议我们进行设置,默认情况下,IdentityServer4 会从客户端的主机名中获取,可以认为,默认情况下,issuer name(IssuerUri)就是授权服务的主机名(比如http://10.9.1.1:5000)。

手动设置IssuerUri代码:

var builder = services.AddIdentityServer(x => x.IssuerUri = "http://111.12.2.21:8000"); //slb 地址

资源服务授权配置修改:

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{Authority = "http://111.12.2.21:8000", //slb 地址ApiName = "trade_refund",RequireHttpsMetadata = false
});

获取access_token示例代码:

var client = new DiscoveryClient("http://111.12.2.21:8000"); //必须是 slb 地址,如果是单独的授权服务地址,会报错误(Value cannot be null. Parameter name: address)
client.Policy.RequireHttps = false;
var disco = await client.GetAsync();
var tokenClient = new TokenClient(disco.TokenEndpoint, clientId, clientSecret);
var tokenResponse = tokenClient.RequestClientCredentialsAsync(scope);
var accessToken = tokenResponse.AccessToken; 

通过 HTTP Post 获取access_token(不通过 slb,直接请求单独的授权服务),可以授权访问资源服务,获取access_token示例:

参考资料:

  • Protecting an API using Client Credentials
  • IdentityServer Options

转载于:https://www.cnblogs.com/xishuai/p/identityserver4-slb.html

IdentityServer4 配置负载均衡相关推荐

  1. docker nginx 配置负载均衡

    在上篇的文章中我们介绍了docker nginx配置简单的代理 在这篇文章我们介绍docker 利用nginx配置负载均衡 所谓的负载均衡是两台服务器,或者是多台服务器上面部署项目,但是访问的方式是通 ...

  2. APACHE 2.2.8+TOMCAT6.0.14配置负载均衡

    作者: jiake0504  链接:http://jiake0504.javaeye.com/blog/265000  发表时间: 2008年11月10日 声明:本文系JavaEye网站发布的原创博客 ...

  3. tenginx配置负载均衡

    tenginx配置负载均衡 一.环境介绍 二.查看tenginx的版本 三.查看默认的配置文件内容 四.tenginx的启停相关操作 1.tenginx的启动 2.tenginx的停止 3.tengi ...

  4. 从编译安装Keepalived 到 配置 负载均衡(LVS-DR)

    最近在研究服务器高可用集群 (HA)-- Keepalived 是用C写的软路由.提供负载均衡与高可用特性. 负载均衡利用IPVS技术 高可用通过VRRP协议实现 更难能的贵的是,一直到最近还在更新 ...

  5. nginx 负载均衡 404_nginx配置负载均衡

    - 负载均衡是网络基础架构的一个非常关键的组成部分,有了负载均衡,我们可以把应用服务器部署多台,避免了服务宕机,也增强了服务的性能及可用性. - 负载均衡的算法有很多 ,这里只是简单提下, - **轮 ...

  6. NGINX基于Tomcat配置负载均衡

    NGINX基于Tomcat配置负载均衡 本部署指南说明了如何使用NGINX开源和NGINX Plus在Apache Tomcat TM应用程序服务器池之间平衡HTTP和HTTPS流量.本指南中的详细说 ...

  7. nginx学习文档之二 配置负载均衡-linux配置负载均衡

    #linux配置负载均衡 linux下配置tomcat负载均衡和windows下是一样的 安装完nginx后直接修改conf下的nginx.conf文件即可 配置文件如下: #user nobody; ...

  8. nginx学习文档之二 配置负载均衡-windows配置负载均衡

    #windows配置负载均衡 nginx+tomcat负载均衡的意思大概如下图: 所有请求先经过nginx服务器,然后由nginx服务器进行转发,将请求根据配置需要分发给指定的tomcat服务器 ## ...

  9. nginx配置 负载均衡_如何配置NGINX负载平衡

    nginx配置 负载均衡 The load balancing is the process of distributing traffic to multiple instances of an a ...

最新文章

  1. 【天命奇御】成就进度62/71的通关攻略(1·开篇前言)
  2. C++继承中构造函数、析构函数调用顺序及虚析构函数
  3. Rainbow的相关资料
  4. 聊聊reactive streams的schedulers
  5. Val编程-系统架构
  6. 收集程序员语录70则
  7. 一种替代的多生产者方法
  8. 【APICloud系列|6】使用APICloud接入客服系统美洽获取Appkey配置
  9. php oracle 配置,关于php:为Windows 64位配置Oracle OCI8
  10. linux 查看磁盘分区,文件系统,使用情况的命令和相关工具介绍,Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍...
  11. 2020年深度学习调参技巧合集
  12. C#LeetCode刷题之#219-存在重复元素 II​​​​​​​(Contains Duplicate II)
  13. Rust : actor模式 与 Actix库
  14. (技术类)中标麒麟linux终端命令操作之小白不知道的点(1)
  15. npoi使用Excel模板下载数据
  16. oracle 两表数据对比---minus
  17. 仿美团下拉菜单 html,React Native仿美团下拉菜单的实例代码
  18. 自建服务器打印机,打印机服务器搭建 -cups
  19. Latex大括号花括号用法之多个子公式分别编号(a)(b)
  20. Clusterrolebindings 创建错误

热门文章

  1. TweenMax动画库学习(三)
  2. 数据库建模模板、菜单显示出问题解决方案
  3. 使用UltraWebGrid运行出错处理[原创]
  4. [导入]关于怎样通过xslt向.NET扩展函数传递OuterXml属性
  5. selenium环境配置
  6. myeclipse 删除历史工作空间记录
  7. win7任务栏还原为xp样式
  8. SSD成就了《扩散性百万亚瑟王》
  9. 石川es6课程---6、解构赋值
  10. Centos 7 下 Corosync + Pacemaker + DRBD + psc + crmsh 实现 mysql 服务高可用