OpenIddict作为容器运行时token issuer不匹配问题如何解决?
解决方案
OpenIddict原生支持分离发行方(Issuer)与公开访问地址配置,完全可以实现和IdentityServer4类似的效果,不需要修改hosts文件,以下是两种常用的可行方案:
方案1:OpenIddict服务端固定Issuer+单独配置公开地址(最推荐)
该方案从根源统一全局Issuer,同时保证前端可以正常访问公开端点,适配跨网络部署场景。
在OpenIddict服务端的服务注册逻辑中调整配置:
services.AddOpenIddict() .AddServer(options => { // 1. 固定全局唯一的Issuer,和签发的token中携带的发行方保持一致 options.SetIssuer(new Uri("http://localhost:4000")); // 2. 单独配置发现文档返回的所有端点的公共前缀,即前端可访问的地址 // 配置后无论从内部login域名还是外部localhost域名请求发现文档,返回的端点地址都是localhost:4000 options.SetPublicUrl(new Uri("http://localhost:4000")); // 保留你原有其余配置,比如授权类型、端点配置、签名密钥等 options.AllowAuthorizationCodeFlow() .AllowRefreshTokenFlow() .SetAuthorizationEndpointUris("connect/authorize") .SetTokenEndpointUris("connect/token") .SetIntrospectionEndpointUris("connect/introspect"); // ...其余原有配置 });
注:
SetPublicUrl为OpenIddict 3.0及以上版本提供的配置项,若使用更早版本建议先升级到稳定的3.x/4.x版本即可使用。
配置完成后,无论API通过内部login域名拉取元数据还是前端通过localhost:4000访问服务,发现文档返回的Issuer统一为http://localhost:4000,所有端点地址也都是前端可访问的localhost地址,同时解决Issuer不匹配和前端无法访问的问题。
方案2:API验证端手动指定合法Issuer
如果不方便修改OpenIddict服务端配置,可以仅调整API侧的验证逻辑,固定校验用的Issuer:
services.AddOpenIddict() .AddValidation(options => { // 保留原有内部访问OpenIddict的元数据地址配置 options.SetConfigurationEndpoint("http://login/.well-known/openid-configuration"); // 手动指定合法Issuer,和服务端签发的token中携带的Issuer保持一致 options.Configure(optionsJwt => { optionsJwt.TokenValidationParameters.ValidIssuer = "http://localhost:4000"; }); // 保留你原有其余配置,比如自省模式的客户端凭证、加密规则等 // ...其余原有配置 });
该方案不需要修改服务端,仅通过API端强制指定合法Issuer完成校验,适合临时快速修复场景。
内容的提问来源于stack exchange,提问作者Ganhammar
相关产品推荐
相关产品推荐

