Сгенерированные URL-адреса для подключений HTTPS отображаются в виде простого HTTP в Azure Web App - PullRequest
1 голос
/ 08 ноября 2019

У меня запущено веб-приложение Java на Tomcat, развернутое в службе приложений Azure. Аутентификация обрабатывается через Azure AD. В локальной среде все работает нормально.

Когда мы развертываем приложение в Azure, httpRequest.getScheme () всегда возвращает HTTP независимо от того, выполняется ли вызов с конечной точки HTTPS.

В результате URL-адрес перенаправления создается с конечной точкой HTTP и не соответствует URL-адресу перенаправления, указанному в регистрациях приложений Azure AD. 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

Кто-нибудь еще сталкивался с этой проблемой? Как этого можно избежать?

1 Ответ

0 голосов
/ 12 ноября 2019

Я провел некоторое исследование по этому вопросу. В веб-приложении Azure оно всегда будет использовать http в качестве протокола. Вы можете получить настоящий протокол из заголовка запроса.

String currentUri = httpRequest.getRequestURL().toString();
String realProto=httpRequest.getHeader("x-forwarded-proto");
if(realProto!=null)     currentUri=currentUri.replaceFirst("http",realProto);
...