You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

访问OIDC UserInfo端点时出现401 Unauthorized异常求助

问题分析

你的核心问题在于完全手动构造了新的OpenIdConnectMessage,丢失了OIDC协议默认处理的关键参数(比如PKCE的code_challenge、code_challenge_method,以及原有State中的完整上下文),同时没有正确同步认证流程中公私网地址的映射逻辑,导致获取的Access Token在请求UserInfo端点时无法通过验证。

修复方案

不要重新创建OpenIdConnectMessage,而是直接修改原有上下文里的ProtocolMessage的IssuerAddress,保留所有默认生成的协议参数,同时确保应用在后端调用KeyCloak接口(比如Token、UserInfo)时使用私网地址,用户前端跳转时使用公网地址。

修正后的OnRedirectToIdentityProvider事件处理器:

private Task OnRedirectToIdentityProvider(RedirectContext ctx)
{
    // 仅替换用户跳转的授权端点为KeyCloak公网地址
    ctx.ProtocolMessage.IssuerAddress = _configuration.GetSection(PublicAuthorizationEndpointUrl).Value;
    // 确保RedirectUri是公网可访问的地址(如果你的应用公网地址和当前请求Host一致,这一步可以省略)
    ctx.ProtocolMessage.RedirectUri = $"https://{你的应用公网域名}{ctx.Request.PathBase}/signin-oidc";
    return Task.CompletedTask;
}

同时保持原有的ConfigureOptions配置不变,无需手动处理State或其他协议参数。

为什么原有代码会导致401
  • 丢失PKCE参数:你启用了UsePkce = true,但手动构造的OpenIdConnectMessage没有包含code_challenge和code_challenge_method,KeyCloak会拒绝无效的认证请求,即使能获取到Token,也会因为PKCE验证失败导致后续接口调用被拒绝。
  • State上下文不完整:手动生成的State只包含了RedirectUri,丢失了原有的请求上下文(比如返回URL、认证属性等),导致OIDC Handler在处理回调时无法正确解析,进而影响Token的验证和使用。
  • 端点逻辑不匹配:原代码未修改Token、UserInfo等后端调用端点的地址,应用会通过私网Authority请求接口,但认证请求用了公网地址,若KeyCloak公私网Realm配置存在差异,会导致Token的Issuer与应用配置不匹配,最终触发401错误。
额外注意事项
  • 确保KeyCloak客户端配置中,Valid Redirect URIs包含应用的公网回调地址(即https://你的应用公网域名/signin-oidc)。
  • 若需要修改后端调用KeyCloak的端点,可通过配置私网元数据地址或手动指定各个端点:
    // 配置私网元数据地址
    options.MetadataAddress = $"{_options.RealmUrl}/.well-known/openid-configuration";
    // 或手动指定单个端点
    options.TokenEndpoint = $"{_options.RealmUrl}/protocol/openid-connect/token";
    options.UserInformationEndpoint = $"{_options.RealmUrl}/protocol/openid-connect/userinfo";
    

内容的提问来源于stack exchange,提问作者Denis Kiryanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:47:36