.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
相关产品推荐
相关产品推荐

