Duende Identity Server 6请求客户端令牌报无效重定向URI错误
问题根因
客户端凭证(Client Credentials)授权流本身不需要传递、校验redirect_uri参数,触发Invalid redirect uri且日志显示redirectUri为null,本质是Identity Server的token端点没有将本次请求识别为标准客户端凭证流请求,转而触发了仅适用于授权码流、隐式流的重定向地址校验逻辑,常见触发场景有三类:
- Identity Server侧对应client_id的客户端配置错误:未正确指定
ClientCredentials为允许的授权类型,错误叠加了需要重定向校验的授权类型,或是误开启了RequireRedirectUri、RequirePkce等仅适用于交互式授权流的强制校验开关。 - 客户端请求代码错误:构造
ClientCredentialsTokenRequest时误传入了交互式授权流的相关参数,或是混用了其他授权流的请求构造逻辑,导致请求参数不符合客户端凭证流的格式要求,被端点识别为其他授权类型请求。 - 依赖包版本不兼容:项目引用的IdentityModel Nuget包版本与Duende Identity Server 6版本不匹配,请求参数序列化异常,导致端点无法正确识别授权类型。
修复方案
按照以下顺序逐一排查修复:
- 修正Identity Server侧客户端配置
定位到发起请求所用client_id对应的客户端配置项,确保配置符合客户端凭证流的要求,参考配置如下:
配置修改后重启Identity Server站点生效。new Client { ClientId = "实际使用的客户端ID", // 明确指定仅允许客户端凭证授权类型 AllowedGrantTypes = GrantTypes.ClientCredentials, // 关闭仅适用于交互式流的强制校验开关 RequirePkce = false, RequireRedirectUri = false, // 配置与客户端请求一致的密钥 ClientSecrets = { new Secret("实际使用的客户端密钥".Sha256()) }, // 配置客户端允许申请的API Scope AllowedScopes = { "需要访问的API Scope名称" } // 无需配置RedirectUris、PostLogoutRedirectUris等交互式流专属属性 }; - 修正客户端API Controller中的请求代码
确保RequestClientCredentialsTokenAsync调用逻辑为客户端凭证流标准写法,不要混入其他授权流的参数,参考实现如下:// 建议通过依赖注入注入IDiscoveryCache、IHttpClientFactory实例,不要硬写Identity Server端点地址 var discoveryDoc = await _discoveryCache.GetAsync(); if (discoveryDoc.IsError) { throw new Exception($"元数据文档拉取失败:{discoveryDoc.Error}"); } var httpClient = _httpClientFactory.CreateClient(); var tokenResponse = await httpClient.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest { Address = discoveryDoc.TokenEndpoint, ClientId = "实际使用的客户端ID", ClientSecret = "实际使用的客户端密钥", Scope = "需要申请的API Scope名称" // 不要在此处赋值RedirectUri等非客户端凭证流参数 }); if (tokenResponse.IsError) { throw new Exception($"Token请求失败:{tokenResponse.Error},错误详情:{tokenResponse.ErrorDescription}"); } - 校验依赖包版本
如果以上配置、代码均无问题,检查客户端项目引用的IdentityModel包版本,升级到与Duende Identity Server 6适配的6.x稳定版本,避免低版本参数序列化异常导致的识别错误。
完成以上操作后重新发起请求,即可正常获取Access Token,不会再触发重定向地址校验错误。
内容的提问来源于stack exchange,提问作者farshad fahimi
相关产品推荐
相关产品推荐

