我面临着以下问题。我有一个要部署到Azure的ASP Net Core 2 Web应用。应用程序身份验证与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请求的所有参数都丢失了,并且身份验证失败,在后端给出了一个HTTP500错误。
我尝试手动将redirect_uri
参数中的协议手动更改为HTTPS,它按预期工作。所以,我唯一需要做的就是让ASP Net Core知道该协议是HTTPS。
如何做到这一点呢?我已经在互联网上搜索了大量页面,但都没有明确的答案。
注:redirect_uri
由Kestrel设置。由于Azure应用程序服务将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应用程序的配置:
WEP应用类型:Linux
应用程序设置:
堆栈:.NET Core 2.0
启动文件:DotNet./webapp-OpenIDConnect-DotNet.dll
WEB_HTTPLOGGING_RETENTION_DAYS:5天
ASPNETCORE_环境:开发
Always On:打开
ARR亲和力:启用
自定义域:
仅HTTPS:打开
诊断日志:
Docker Container日志记录:文件系统
配额(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。该重定向不应该发生,因为POST应该首先通过HTTPS请求,但这并没有发生,因为在第一个请求的reDirect_uri中使用了错误的http协议。
更新4
我已经确认,只有当选择的服务计划是Linux服务计划时,才会出现此问题。如果服务计划是Windows服务计划(使用与更新1的示例完全相同的代码和配置),则根本不会发生此问题。这可能是问题的变通办法,但不是解决方案。Linux应用程序服务似乎存在缺陷。
7条答案
按热度按时间cig3rfwq1#
我自己也有这个问题。我深入研究了微软的Microsoft.AspNetCore.Authentication,并找出了他们是如何构造重定向URL的:
因为Web应用程序已经强制使用HTTPS,所以这可以通过Startup.cs中的以下代码来解决
您只需添加此引用:
azpvetkf2#
请参考以下链接:
通过对配置进行3次更改,我在Linux应用程序计划上实现了所有功能。
第一步:配置ForwardedHeadersOptions
第二步:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
方法中的UseForwardedHeaders第三步:只能使用UseHttpsReDirection进行生产
9gm1akwq3#
这里有一个来自Chris Ross(又名Tratcher)的推荐解决方案的链接,他是ASP.NET身份和身份服务器的家伙。
您需要的代码是
它似乎只适用于.NET Core v2.x,并在3.0版中得到了修复。
ct2axkht4#
我面临着以下问题。我有一个要部署到Azure的ASP Net Core 2 Web应用。应用程序身份验证与Azure Active Directory集成。
既然您没有提到您是如何将AAD身份验证集成到您的Web应用程序中的。此外,我还检查了当通过
http://analytics.lantek360.com
或https://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。
为了满足您的需求,我假设您可以手动使用中间软件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。
voase2hg5#
解决该问题的方法如下所示:
不幸的是,我去看了我是如何修复它的代码,但我不记得为什么会是这样:)(我留下的评论也没有太大帮助)
希望能有所帮助。
oalqel3c6#
通过组合以下ForwardedHeadersOptions配置使其工作:
ct2axkht7#
Azure使用传入的Request.Schema来构建回复URL,即使您希望它是HTTPS。如果您在任何地方使用TLS终止,它可能会导致架构被读取为‘http’
我用Kubernetes集群尝试了X-Forwarding,但无法正确配置,但使用定制中间件修复传出响应要容易得多。