Доступ к веб-службе веб-приложения Azure через AAD с использованием MSI - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть веб-приложение Azure (служба приложений), работающее с Tomcat. Я развернул 2 военных приложения. WAR-1 предоставляет вызов веб-службы, который возвращает файлы JSON с помощью Springboot. WAR-2 - это веб-приложение, которое вызывает эти веб-службы в WAR-1. Это веб-приложение имеет назначенный системой управляемый идентификатор (или MSI). Кроме того, в этом веб-приложении включена аутентификация через AAD с использованием конфигурации Express.

Я могу получить доступ к статическим страницам в WAR-2 после аутентификации через AAD. Теперь мне нужно получить данные из WAR-1. У меня есть сервлет, который содержит такой код:

String subscriptionId = "xxxx";
String testURL    = "https://yyy.azurewebsites.net/war1/person/100";
String resourceId = "https://management.azure.com/";

AppServiceMSICredentials credentials = new AppServiceMSICredentials(AzureEnvironment.AZURE);
Azure azure = Azure.configure()
                .withLogLevel(LogLevel.BODY_AND_HEADERS)
                .authenticate(credentials)
                .withSubscription(subscriptionId);
String token = credentials.getToken(resourceId);
HttpURLConnection conn = (HttpURLConnection) new URL(testURL).openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setRequestMethod("GET");
conn.setRequestProperty("Authorization", "Bearer " + token);

int responseCode = conn.getResponseCode();

OutputStream os = conn.getOutputStream();
....

Я могу получить токен, но код ответа 500, когда я выполняю вызов GET.

Так что мой вопрос... это правильный способ сделать этот вызов? Я нашел статью https://dotnetdevlife.wordpress.com/2018/10/22/call-azure-ad-protected-website-using-managed-service-identity-msi/, похожую на эту ситуацию, но она использует .Net. Я не могу найти Java-эквивалент этого.

1 Ответ

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

Я проверил на моей стороне, и вот мои шаги:

1. Два приложения в одном веб-приложении Azure.

Приложение 1: https://jackdemoapp1.azurewebsites.net/app1/

Приложение 2: https://jackdemoapp1.azurewebsites.net/app2/

2. Настройте Аутентификацию / Авторизацию на портале Azure.

enter image description here

И вы можете получить идентификатор клиента, нажав на детали, запишите его, и мы будем его использоватьв приложении 2:

enter image description here

3. Настройка управляемого удостоверения на портале Azure

enter image description here

Чтобы упростить тест, app1 просто вернет строку «Hello».

enter image description here

4. Код в приложении 2

    @ResponseBody
    @RequestMapping("/")
    public String index() {

        JSONObject json = new JSONObject();

        try {
            AppServiceMSICredentials credential = new AppServiceMSICredentials(AzureEnvironment.AZURE);
            // As we want to get token for accessing the aad-protected app, change the
            // resource to the client ID you get in step 2
            String token = credential.getToken("ac07d701-6f7d-462e-8b67-5dffa1df955f");
            json.put("token", token);

            // The URL for app1 API
            String app1 = "https://jackdemoapp1.azurewebsites.net/app1/";
            HttpURLConnection conn = (HttpURLConnection) new URL(app1).openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Authorization", "Bearer " + token);
            conn.setDoOutput(true);
            conn.setDoInput(true);

            // Open the connection
            conn.connect();

            int code = conn.getResponseCode();
            if (code >= 200 && code <= 300) {
                try (InputStream inputStream = conn.getInputStream();
                        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                        BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
                    StringBuilder stringBuilder = new StringBuilder();
                    String line = "";

                    while ((line = bufferedReader.readLine()) != null) {
                        stringBuilder.append(line);
                    }

                    String response = stringBuilder.toString();
                    json.put("response", response);
                }
            } else {
                json.put("Error", "Response Code" + conn.getResponseCode());
            }
            conn.disconnect();

        } catch (Exception e) {
            json.put("Exception", e.getStackTrace());
        }
        return json.toString();
    }

Результат

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...