如何在Azure Web Apps中将redirect_uri协议设置为HTTPS

缥帙各舒散,前后互相逾。这篇文章主要讲述如何在Azure Web Apps中将redirect_uri协议设置为HTTPS相关的知识,希望能为你提供帮助。
我面临以下问题。我有一个ASP Net Core 2 Web应用程序,我想部署到Azure。应用程序身份验证与Azure Active Directory集成,因此当我尝试登录时,会发生以下请求:

GET https://login.microsoftonline.com/ecf3f643-27e5-4aa7-9d56-fd350e1e9c37/oauth2/authorize?client_id=20a2bcb5-0433-4bb4-bba3-d7dc4c533e85& redirect_uri=http://myapplication.mydomain.com/account/signin [...]200 OK POST http://myapplication.mydomain.com/account/signin 301 Redirect --> https://myapplication.mydomain.com/account/signin GET https://myapplication.mydomain.com/account/signin 500 Internal Server Error

第一个GET是正常的Azure Active Directory登录请求。请注意,redirect_uri参数具有协议http。
第二个请求是重定向到redirect_uri,一个带有一些参数的POST。由于我已将Azure配置为仅允许HTTPS流量,因此IIS使用HTTPS重定向到相同的URL。这是第三个要求。请注意,此第三个请求是GET请求,因为HTTP redirection is always a GET request POST请求的所有参数都会丢失,并且身份验证失败会在后端发出HTTP 500错误。
我试图手动将redirect_uri参数中的协议手动更改为HTTPS,并且它按预期工作。因此,我唯一需要的是让ASP Net Core意识到协议是HTTPS。
怎么办?我在互联网上搜索了大量的页面而没有明确的答案。
注意:redirect_uri由Kestrel设定。由于Azure App Service将IIS放在我的Kestrel前面并在那里进行SSL终止,因此Kestrel和我的应用程序不知道协议是HTTPS,因此在重定向uri中使用HTTP。
更新1
根据@Bruce的建议,我尝试了here示例,克隆存储库并配置应用程序和AD中所述,并且我能够重现错误。
重定向URI继续使用http协议。如果我只在AD应用程序配置中添加https端点作为回复URL,我得到错误The reply address 'http://testloginad.azurewebsites.net/signin-oidc' does not match the reply addresses configured for the application。如果我将http协议端点添加为回复URL,则会收到如下所示的HTTP 500错误:
System.Exception: Correlation failed. at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.< HandleRequestAsync> d__12.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.< Invoke> d__6.MoveNext()

我仍然认为问题与Kestrel有关,不知道通过HTTPS完成连接,但我不知道如何将信息传达给它。
更新2
我使用的Azure Web应用程序的配置:
  • Web App类型:Linux
  • 应用程序设置: 堆栈:.NET Core 2.0 启动文件:dotnet ./WebApp-OpenIDConnect-DotNet.dll WEBSITE_HTTPLOGGING_RETENTION_DAYS:5 ASPNETCORE_ENVIRONMENT:发展 始终开启:开启 ARR亲和力:开启
  • 自定义域名: 仅限HTTPS:开启
  • 诊断日志: Docker容器记录:文件系统 配额(MB):35 保留期(天):5
web.config文件中,我修改了以下行,如下所示:
< aspNetCore processPath="dotnet" arguments="./WebApp-OpenIDConnect-DotNet.dll" stdoutLogEnabled="false" stdoutLogFile="./stdout.log" />

基本上我提出斜杠而不是反斜杠,以避免Linux路径出现问题。
使用默认设置配置其他所有内容。
更新3根据@Tratcher的要求,我在这里添加了服务器响应的标题(为了简洁起见,我只包括我认为相关的标题,如果你想看到任何其他标题,请随意让我添加它):
  • 第一次请求(GET https://login.microsoftonline.com/ecf...): 服务器:Microsoft-IIS/10.0 Set-Cookie:ESTSAUTHPERSISTENT=AQAFCCEADDB…sts; path=/; secure; HttpOnly 严格的运输安全:max-age=31536000; includeSubDomains
  • 第二次请求(POST http://testloginad.azurewebsites.net/signin-oidc): 地点:https://testloginad.azurewebsites.net/signin-oidc 服务器:Microsoft-IIS/10.0
  • 第三次请求(GET https://testloginad.azurewebsites.net/signin-oidc): 服务器:Kestrel
任何请求中都不会出现x-forwarded-proto标头。
请注意,问题的根源可能在第二个请求的重定向中,即将HTTP POST重定向到HTTPS GET。该重定向不应该发生,因为首先应该通过HTTPS请求POST,但是由于第一个请求的redirect_uri中的http协议错误而没有发生。
更新4
我已经确认只有选择的服务计划是Linux服务计划才会出现此问题。如果服务计划是Windows服务计划(使用与UPDATE 1示例完全相同的代码和配置),则根本不会发生此问题。对于问题,这可能是一种解决方法,但不是解决方案。 Linux应用程序服务似乎有缺陷。
答案通过查阅这些链接:
  • 这个问题 ; -)
  • https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?tabs=aspnetcore2x& view=aspnetcore-2.2#configure-a-reverse-proxy-server
  • https://github.com/aspnet/Security/issues/1901
并对配置应用了3个更改,我将所有内容都用于Linux应用程序计划。
第1步:配置ForwardedHeadersOptions
services.Configure< ForwardedHeadersOptions> (options => { options.RequireHeaderSymmetry = false; options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // TODO : it's a bit unsafe to allow all Networks and Proxies... options.KnownNetworks.Clear(); options.KnownProxies.Clear(); });

第2步:在public void Configure(IApplicationBuilder app, IHostingEnvironment env)方法中使用ForwardedHeaders
app.UseForwardedHeaders();

第3步:仅使用UseHttpsRedirection进行生产
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); // Forward http to https (only needed for local development because the Azure Linux App Service already enforces https) app.UseHttpsRedirection(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); }

另一答案我自己有问题。我深入研究了Microsoft的Microsoft.AspNetCore.Authentication,并了解了他们如何构建重定向url:
protected string BuildRedirectUri(string targetPath) => Request.Scheme + "://" + Request.Host + OriginalPathBase + targetPath;

由于Web App已经强制使用HTTPS,因此可以使用Startup.cs中的以下代码解决此问题
app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedProto });

您只需添加此引用:
using Microsoft.AspNetCore.HttpOverrides;

另一答案
我面临以下问题。我有一个ASP Net Core 2 Web应用程序,我想部署到Azure。应用程序身份验证与Azure Active Directory集成在一起。
由于您没有提到您是如何将AAD身份验证集成到Web应用程序中的。此外,我已经检查过,当通过http://analytics.lantek360.comhttps://analytics.lantek360.com访问您的应用程序时,redirect_uri查询字符串将是相同的:http://analytics.lantek360.com/account/signin。您可以提供更多详细信息(例如,您是如何构建授权请求)以缩小此问题。
由于我已将Azure配置为仅允许HTTPS流量
“仅HTTPS”设置使用URL重写规则将HTTP重定向到HTTPS。细节,你可以关注How to make an Azure App Service HTTPS only。
根据您的要求,我假设您可以手动使用middileware Microsoft.AspNetCore.Authentication.OpenIdConnect将Azure AD集成到.Net Core Web应用程序中。对于这种方法,您可以按照以下教程:
Integrating Azure AD (v1.0 endpoint) into an ASP.NET Core web app
Integrating Azure AD (v2.0 endpoint) into an ASP.NET Core web app
注意:
OpenID Connect的redirect_uri看起来像http(s)://< your-appname> .azurewebsites.net/signin-oidc。由于您只需要Https,您只需要为您的AAD应用添加重定向URI(https://{your-appname}.azurewebsites.net/signin-oidc)。
此外,您还可以利用App Service Authentication / Authorization启用AAD身份验证,而无需更改Web应用程序中的代码。详细信息,您可以在Azure门户中关注Configure your App Service app to use Azure Active Directory login。
另一答案解决问题的方法如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // .../*** * Forwarded Headers were required for nginx at some point. * https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1#nginx-configuration ***/ app.UseForwardedHeaders(new ForwardedHeadersOptions { RequireHeaderSymmetry = false, ForwardedHeaders = ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedFor }); // ... }

不幸的是我去了解我如何修复它的代码,但我不记得为什么会这样:)(我留下的评论也不是很有帮助)
希望能帮助到你。
另一答案【如何在Azure Web Apps中将redirect_uri协议设置为HTTPS】通过组合以下ForwardedHeadersOptions配置使其工作:
Options.ForwardedHeaders = ForwardedHeaders.All; Options.ForwardLimit = null; Options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("10.0.0.0"), 8)); Options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("172.16.0.0"), 12)); Options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("192.168.0.0"), 16));


    推荐阅读