将 OpenIddict 作为容器运行时令牌颁发者的问题

Posted

技术标签:

【中文标题】将 OpenIddict 作为容器运行时令牌颁发者的问题【英文标题】:Problems with token issuer when running OpenIddict as a container 【发布时间】:2022-01-11 16:06:58 【问题描述】:

我正在尝试在 Docker 中与 Api 一起运行 OpenIddict,Api 通过 docker-compose (api -> login) 中定义的链接与 OppenIddict 应用程序通信。我有一个在 Docker 外部运行的前端应用程序访问 Api 并通过localhost-addresses 登录。一切正常,直到 Api 使用链接地址 (login) 与登录应用程序通信,然后问题是令牌的颁发者不匹配。 在这种情况下,颁发者是 http://localhost:4000,当 OpenIddict 验证令牌时,它期待 http://login

我尝试更改StartupOpenIddictServerBuilder 中的颁发者,然后问题是它更改了发现文档中使用的基地址,导致前端尝试连接到http://login

对此的一个潜在解决方案是更改主机文件并设置网络重定向(将 login 重定向到 127.0.1.1 并将网络重定向设置为使用 localhost:4000),但这感觉像是一个过于复杂的解决方案。

IdentityServer4 也有类似的问题,但您可以在不影响基地址的情况下更改发行者。

希望我能很好地解释这个问题,任何想法都非常感谢!

【问题讨论】:

【参考方案1】:

终于想通了,可以在Startup中配置OpenIddict服务器的时候指定一个有效的issuer列表。在这里我可以说http://localhost:4000 是一个有效的颁发者,因此即使它使用不同的地址进行通信,当 Api 验证它时令牌也是有效的。如果将来对任何人有帮助,我会这样做:

services.AddOpenIddict()
  .AddCore()
  .AddServer(builder =>
  
    builder.Configure(options =>
    
      options.TokenValidationParameters.ValidIssuers = new List<string>
      
        "http://localhost:4000/",
      ;
    );
  );

【讨论】:

以上是关于将 OpenIddict 作为容器运行时令牌颁发者的问题的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak:作为 docker 服务运行时令牌颁发者无效

当在 jwt 承载处理程序中配置的不同别名下到达站点时,验证颁发者失败

连接到 CommissionJunction 令牌时出错:[60] SSL 证书问题:无法获取本地颁发者证书

JwtFormat:为啥将令牌的颁发者添加到 ValidIssuers 属性中?

当我期待 https://login.microsoftonline.com 时,来自天蓝色活动目录的访问令牌中的颁发者是 https://sts.windows.net

OpenIdDict 多个授权服务器无法解码相同的访问令牌