ASP.NET Core对接Microsoft Graph时redirect_uri为http而非https如何解决
解决方案
1. 配置反向代理转发头(推荐,适配Linux部署常见架构)
绝大多数Linux环境下ASP.NET Core应用都会搭配Nginx/Apache等反向代理使用,外部HTTPS请求到达反向代理后,默认以HTTP协议转发给后端Kestrel服务,导致应用识别到的请求协议为HTTP,生成错误的redirect_uri。
你需要在应用中启用转发头中间件:
- 首先在Program.cs(.NET 6+)的中间件管道最开头(
UseAuthentication、UseAuthorization之前)添加如下代码:
builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 如果反向代理不在同一服务器,可添加代理IP到KnownProxies集合,生产环境按需配置允许的代理范围即可 options.KnownProxies.Add(IPAddress.Parse("你的反向代理内网IP")); }); var app = builder.Build(); // 转发头中间件必须放在最开头 app.UseForwardedHeaders(); // 后面再依次添加UseHttpsRedirection、UseRouting、UseAuthentication、UseAuthorization等其他中间件
- 同时在你的反向代理配置中添加转发头规则,以Nginx为例,在站点配置的location段添加:
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr;
2. 强制指定OpenIdConnect回调协议
如果不方便调整反向代理配置,可以直接在身份认证配置中强制redirect_uri使用HTTPS协议:
在添加Microsoft身份认证的代码后补充配置OpenIdConnect参数:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi(initialScopes) .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph")) .AddInMemoryTokenCaches(); // 新增这段配置强制redirect_uri为HTTPS builder.Services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options => { options.Events.OnRedirectToIdentityProvider = context => { // 强制替换redirect_uri的协议为HTTPS var redirectUri = new UriBuilder(context.ProtocolMessage.RedirectUri); redirectUri.Scheme = "https"; redirectUri.Port = -1; // 默认使用HTTPS标准端口443,如果你使用自定义HTTPS端口可自行修改 context.ProtocolMessage.RedirectUri = redirectUri.ToString(); return Task.CompletedTask; }; });
3. 辅助检查项
- 确认Azure AD应用注册中的重定向URI配置的是完整的HTTPS地址:
https://mysite/signin-oidc - 如果启用了HTTPS强制跳转,确认
UseHttpsRedirection中间件的顺序在UseForwardedHeaders之后
内容的提问来源于stack exchange,提问作者Ernesto Rodriguez
相关产品推荐
相关产品推荐

