.NET 9中用AspNet.Security.OAuth.Apple配置Apple登录报无效重定向URL
问题背景
旧版.NET应用已成功实现Apple登录,迁移到.NET 9应用后,配置复用并适配现代.NET Identity机制,却出现Apple授权页面返回invalid_request Invalid web redirect url错误。已在Apple开发者后台添加新域名和重定向URI,配置值(ClientId/KeyId/TeamId)均与旧版一致,本地测试通过Fiddler将local.myappusers.com映射到localhost:port。
当前配置代码(Program.cs)
builder.Services.AddAuthentication() [... 其他提供程序在此,运行正常 ...] .AddApple(options => { options.CallbackPath = "/api/auth/signin-apple"; options.ClientId = builder.Configuration.GetValue<string>("pl-microservices-myappusers:Authentication:AppleClientId"); options.KeyId = builder.Configuration.GetValue<string>("pl-microservices-myappusers:Authentication:AppleKeyId"); options.TeamId = builder.Configuration.GetValue<string>("pl-microservices-myappusers:Authentication:AppleTeamId"); options.PrivateKey = (_, _) => Task.FromResult( builder.Configuration.GetValue<string>("pl-microservices-myappusers:Authentication:ApplePrivateKey") .AsMemory() ); options.GenerateClientSecret = true; options.Events.OnRedirectToAuthorizationEndpoint = context => { var uriBuilder = new UriBuilder(context.RedirectUri); var query = QueryHelpers.ParseQuery(uriBuilder.Query); query["redirect_uri"] = "https://local.myappusers.com/api/auth/signin-apple"; var newQuery = QueryString.Create( query.SelectMany(q => q.Value, (q, v) => new KeyValuePair<string, string>(q.Key, v)) ); uriBuilder.Query = newQuery.ToString().TrimStart('?'); context.Response.Redirect(uriBuilder.Uri.ToString()); return Task.CompletedTask; }; });
Apple开发者后台配置
- 域名:
local.myappusers.com - 重定向URI:
https://local.myappusers.com/api/auth/signin-apple
错误现象
跳转至https://appleid.apple.com/auth/authorize?[...]后,页面显示:
invalid_request
Invalid web redirect url.
手动在OnRedirectToAuthorizationEndpoint中修改redirect_uri后问题依然存在。
问题排查与解决方案建议
1. 移除手动修改redirect_uri的自定义逻辑
Apple验证要求请求中的redirect_uri与生成Client Secret时使用的URI完全一致,手动修改可能导致不匹配。删除OnRedirectToAuthorizationEndpoint的自定义代码,让AspNet.Security.OAuth.Apple自动生成正确的redirect_uri:
// 移除这段自定义逻辑 // options.Events.OnRedirectToAuthorizationEndpoint = context => // { // ... // };
2. 修正PrivateKey的格式处理
Apple的PrivateKey需要是完整的PEM格式(包含-----BEGIN PRIVATE KEY-----头部和-----END PRIVATE KEY-----尾部),配置字符串中的换行符可能被转义,需手动还原:
var privateKey = builder.Configuration.GetValue<string>("pl-microservices-myappusers:Authentication:ApplePrivateKey") .Replace("\\n", "\n"); options.PrivateKey = (_, _) => Task.FromResult(privateKey.AsMemory());
3. 显式指定SignInScheme与完整回调路径
.NET 9中Identity机制可能需要明确指定登录Scheme,同时确保CallbackPath的格式正确:
options.CallbackPath = new PathString("/api/auth/signin-apple"); options.SignInScheme = IdentityConstants.ApplicationScheme; // 适配.NET Identity的默认Scheme
4. 验证本地HTTPS配置
Apple要求重定向URI必须使用HTTPS,确保本地localhost:port使用有效的HTTPS证书:
- 运行
dotnet dev-certs https --trust生成并信任本地开发证书 - 检查Fiddler代理是否正确处理HTTPS流量,避免篡改URI的协议或端口
5. 确认Apple Service ID配置细节
- 确保
ClientId对应的Service ID已启用Sign In with Apple功能 - 检查Domains and Subdomains中已添加
local.myappusers.com - 重定向URI需精确匹配(无多余斜杠、参数,协议为HTTPS)
内容的提问来源于stack exchange,提问作者Piotrek

