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

.NET7 C# OAuth2中Redirect URI被覆盖问题求助

解决.NET7 OAuth2中RedirectUri被自动覆盖的问题

问题核心

你混淆了两个RedirectUri的作用:

  • AuthenticationProperties.RedirectUri:是授权成功后,你的应用在处理完OAuth回调后要跳转的内部地址,并非发给Salesforce的授权请求里的redirect_uri参数。
  • 发给OAuth服务商的redirect_uri:默认由中间件自动拼接(当前请求主机 + CallbackPath),这才是你需要修改的目标参数。

之前尝试的OnTicketReceived/OnCreatingTicket事件触发时机太晚,无法影响已经生成的授权请求URL,所以没有效果。

解决方案

通过OAuthEvents.OnRedirectToAuthorizationEndpoint事件,在构造跳转至Salesforce授权端点的URL时,手动替换redirect_uri参数值。

修改后的完整配置代码

builder.Services.AddAuthentication("cookie")
    .AddCookie("cookie")
    .AddOAuth("Project", o =>
    {
        o.AuthorizationEndpoint = "https://mysalesforceSite.com/services/oauth2/authorize";
        // CallbackPath是你的应用内处理回调的路径,仅需路径部分,无需域名
        o.CallbackPath = new PathString("/external/callback");
        o.TokenEndpoint = "https://mysalesforceSite.my.site.com/services/oauth2/token";
        o.ClientId = "123456";
        o.ClientSecret = "A123456";
        o.ReturnUrlParameter = "code";
        o.SaveTokens = true;
        o.UserInformationEndpoint = "https://mysalesforceSite.com/services/oauth2/userinfo";

        // 关键:在生成授权跳转URL时替换redirect_uri
        o.Events = new OAuthEvents
        {
            OnRedirectToAuthorizationEndpoint = ctx =>
            {
                // 替换为你需要的外部域名回调地址
                var customRedirectUri = "https://Something.azurewebsites.net/external/callback";
                
                // 解析并修改授权URL中的redirect_uri参数
                var uriBuilder = new UriBuilder(ctx.RedirectUri);
                var queryParams = System.Web.HttpUtility.ParseQueryString(uriBuilder.Query);
                queryParams["redirect_uri"] = customRedirectUri;
                uriBuilder.Query = queryParams.ToString();
                
                ctx.RedirectUri = uriBuilder.ToString();
                ctx.Response.Redirect(ctx.RedirectUri);
                return Task.CompletedTask;
            }
        };
    });

Login端点调整

AuthenticationProperties.RedirectUri改为授权完成后你的应用内部跳转地址(如果不需要跳转可设为null):

app.MapGet("/Login", () => {
    AuthenticationProperties ap = new AuthenticationProperties()
    {
        // 授权成功后,应用内部跳转的地址(非发给Salesforce的回调地址)
        RedirectUri = "/home",
        IsPersistent = true,
        AllowRefresh = true,
    };
    
    return Results.Challenge(ap, authenticationSchemes: new List<string>() { "Project" });
});

额外注意事项

  • 确保https://Something.azurewebsites.net/external/callback已添加至Salesforce OAuth应用的允许回调地址列表,否则会被Salesforce拒绝请求。
  • CallbackPath必须与外部域名的回调路径一致(即/external/callback),保证中间件能正确处理回调请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:56:03