asp.net-core – 如何在Azure Web Apps中将redirect_uri协议设置
我面临以下问题.我有一个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,则会收到错误回复地址’http://testloginad.azurewebsites.net/signin-oidc’与为应用程序配置的回复地址不匹配.如果我将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 App类型:Linux >堆栈:.NET Core 2.0 >自定义域名: >仅限HTTPS:开启 >诊断日志: > Docker容器记录:文件系统 在web.config文件中,我修改了以下行,如下所示: <aspNetCore processPath="dotnet" arguments="./WebApp-OpenIDConnect-DotNet.dll" stdoutLogEnabled="false" stdoutLogFile="./stdout.log" /> 基本上我提出斜杠而不是反斜杠,以避免Linux路径出现问题. 使用默认设置配置其他所有内容. 更新3 >第一个请求(GET https://login.microsoftonline.com/ecf …): >服务器:Microsoft-IIS / 10.0 >第二次请求(POST http://testloginad.azurewebsites.net/signin-oidc): >地点:https://testloginad.azurewebsites.net/signin-oidc >第三次请求(GET https://testloginad.azurewebsites.net/signin-oidc): >服务器:红隼 任何请求中都不会出现x-forwarded-proto标头. 请注意,问题的根源可能在第二个请求的重定向中,即将HTTP POST重定向到HTTPS GET.该重定向不应该发生,因为首先应该通过HTTPS请求POST,但是由于第一个请求的redirect_uri中的http协议错误而没有发生. 更新4 我已经确认只有选择的服务计划是Linux服务计划才会出现此问题.如果服务计划是Windows服务计划(使用与UPDATE 1示例完全相同的代码和配置),则根本不会发生此问题.对于问题,这可能是一种解决方法,但不是解决方案. Linux应用程序服务似乎有缺陷. 解决方法
我自己有问题.我深入研究了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 – 可以在机器之间复制Cookie以假冒用户吗?
- asp.net类序列化生成xml文件实例详解
- asp.net-core – ASP.NET 5(MVC6)如何为用户播种
- ASP.NET -- WebForm -- ViewState
- asp.net-mvc-3 – 如何在ASP.NET MVC 3中更新EF 4实体?
- ASP.NET MVC 5 – RazorGenerator与发布期间的发布预编译
- asp.net-mvc – 如何在Kendo模板中动态设置列
- asp-classic – 经典asp运行的用户是什么?
- asp.net-mvc – 将JSON.NET JObject转换为JsonResult的异常
- asp.net-mvc – 是否有可能在ASP.NET MVC中对一些AddModelE
- Asp.Net Identity – 在运行时设置CookieDomain
- 如何在ASP.NET 3.5中使per- http请求缓存
- asp.net-mvc-3 – mvc razor editortemplate中的
- asp.net – 调用Web服务提供“无法连接到远程服务
- 连续部署到ASP.NET的ASP.NET核心应用程序
- asp.net-mvc-3 – 将复选框绑定到MVC中的int数组
- asp.net-web-api – 微服务与多层架构
- 在ASP.NET MVC4 Web应用程序上,w3wp的CPU使用率上
- asp.net-mvc – 缺少webpages_UsersInRoles
- asp.net-mvc – Ninject MVC和WCF扩展不能与InRe