我有一个在Tomcat上运行的Java Webapp部署到Azure App Service。身份验证通过Azure AD处理。在本地环境中,一切似乎都可以正常工作。
当我们将应用程序部署到Azure时,无论是否从HTTPS端点进行调用,httpRequest.getScheme()始终返回HTTP。
因此,重定向URL是使用HTTP终结点构造的,并且与Azure AD应用程序注册中指定的重定向URL不匹配。 redirectUrl的构造如下。
String currentUri = httpRequest.getRequestURL().toString();
String redirectUrl = authority + tenant +
"/oauth2/authorize? response_type=code&scope=user.read.all&response_mode=form_post&redirect_uri="
+ URLEncoder.encode(currentUri, "UTF-8") + "&client_id=" + clientId +
"&resource=https%3a%2f%2fgraph.microsoft.com" + "&state=" + state + "&nonce="
+ nonce;
我已经搜索并找到了这个https://creechy.wordpress.com/2011/08/22/ssl-termination-load-balancers-java/。负载均衡器可能会导致这种类型的问题,我们需要修改Tomcat配置。
如果我们在本地服务器上部署WAR文件,则应用程序可以正常工作。仅在Azure中发生问题。
redirectUrl始终包含http://xxxxx.azurewebsites.net,但在应用程序注册中,redirectUrl被指定为https://xxxx.azurewebsites.net
还有其他人遇到过这个问题吗?如何避免这种情况?
答案 0 :(得分:0)
我对此做了一些研究。在Azure Web应用程序内部,它将始终使用http作为协议。您可以从请求标头中获取真实协议。
String currentUri = httpRequest.getRequestURL().toString();
String realProto=httpRequest.getHeader("x-forwarded-proto");
if(realProto!=null) currentUri=currentUri.replaceFirst("http",realProto);