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

配置Microsoft.IdentityModel.Protocols.OpenIdConnect时如何调整授权端点参数拼接?

解决OpenID Connect授权请求参数拼接问题

问题根源

你当前的配置直接将AuthorizationEndpoint设置为带next参数的登录URL,框架会默认把所有OIDC授权参数(如client_id、redirect_uri等)直接拼接在整个URL末尾,导致这些参数成为登录端点的查询参数,而非next指向的/oauth2/authorize端点的参数。

解决方案:自定义授权重定向逻辑

不要硬编码带next的AuthorizationEndpoint,而是通过OpenIdConnectOptions的OnRedirectToIdentityProvider事件,手动构建符合要求的授权URL。具体步骤如下:

  1. 修正基础配置,移除硬编码的AuthorizationEndpoint,保留正确的Authority(注意你代码里Authority写的是https://id.xyz.com,但实际服务器是https://id.yyy.com,这里要修正)。
  2. 在OnRedirectToIdentityProvider事件中,构建完整的/oauth2/authorize请求URL(包含所有OIDC参数),将其编码后作为next参数的值,拼接登录端点URL。

示例代码

// 修正后的配置
opt.ClientId = "CLIENT_ID";
opt.ClientSecret = "CLIENT_SECRET";
opt.Authority = "https://id.yyy.com"; // 修正为实际服务器地址
opt.ResponseType = "code";
opt.GetClaimsFromUserInfoEndpoint = true;
opt.CallbackPath = new PathString("/Auth/Callback");

// 移除原来手动设置的Configuration,改用事件自定义重定向URL
opt.Events = new OpenIdConnectEvents
{
    OnRedirectToIdentityProvider = context =>
    {
        // 构建/oauth2/authorize的基础URL
        var authorizeUrl = new Uri("https://id.yyy.com/oauth2/authorize");
        
        // 将所有OIDC授权参数添加到authorizeUrl的查询字符串中
        var queryBuilder = new QueryBuilder();
        queryBuilder.Add("client_id", context.ProtocolMessage.ClientId);
        queryBuilder.Add("redirect_uri", context.ProtocolMessage.RedirectUri);
        queryBuilder.Add("response_type", context.ProtocolMessage.ResponseType);
        queryBuilder.Add("scope", context.ProtocolMessage.Scope);
        queryBuilder.Add("state", context.ProtocolMessage.State);
        // 如需其他参数,可继续添加
        
        // 拼接完整的authorize请求URL
        var fullAuthorizeUrl = authorizeUrl.AbsoluteUri + queryBuilder.ToQueryString();
        
        // 构建登录URL,将编码后的fullAuthorizeUrl作为next参数的值
        var loginUrl = new Uri($"https://id.yyy.com/accounts/login/?next={Uri.EscapeDataString(fullAuthorizeUrl)}");
        
        // 替换默认的重定向URL
        context.ProtocolMessage.IssuerAddress = loginUrl.AbsoluteUri;
        
        return Task.CompletedTask;
    }
};

关键说明

  • Uri.EscapeDataString用于正确编码next参数的值,避免特殊字符导致参数解析错误。
  • 事件中可以访问context.ProtocolMessage获取框架生成的所有OIDC参数,无需手动拼接,保证参数完整性。
  • 确保Authority配置正确,框架会自动发现OIDC元数据(如果你的服务器支持的话),如果不支持元数据发现,再手动配置TokenEndpoint等端点信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:25:19