Проблемы с манифестом приложения Azure при попытке аутентификации с помощью office-js-helpers в веб-надстройке Outlook

Я использую office-js-helpers, чтобы получить токен OAuth в моем Веб-надстройка Outlook, поэтому я могу использовать ее для OAuthCredentials с управляемым API EWS (код для этого находится в службе приложений Azure с использованием веб-API ASP.NET).

Я настроил регистрацию приложения моего приложения в моем тестовом клиенте Office 365 (например, mytenant.onmicrosoft.com, который НЕ является той же подпиской Azure, в которой размещено веб-приложение - если это имеет значение) как собственное приложение с параметром oauth2AllowImplicitFlow, установленным в значение true. Я использовал тип приложения Native вместо приложения Web / API, чтобы обойти неожиданную ошибку, указывающую, что мое приложение требует согласия администратора - хотя разрешения приложения не запрашивались - но это уже другая история (возможно, я все равно должен использовать Native - не уверен на 100%) .

Я убедился, что URI перенаправления (также известный как URL-адрес ответа) в регистрации приложения указывает на ту же страницу, что и надстройка Outlook (например, https://mywebapp.azurewebsites.net/MessageRead.html).

Вот мой манифест приложения:

{ "appId": "a11aaa11-1a5c-484a-b1d6-86c298e8f250", "appRoles": [], "availableToOtherTenants": true, "displayName": "My App", "errorUrl": null, "groupMembershipClaims": null, "optionalClaims": null, "acceptMappedClaims": null, "homepage": "https://myapp.azurewebsites.net/MessageRead.html", "identifierUris": [], "keyCredentials": [], "knownClientApplications": [], "logoutUrl": null, "oauth2AllowImplicitFlow": true, "oauth2AllowUrlPathMatching": false, "oauth2Permissions": [], "oauth2RequiredPostResponse": false, "objectId": "a11aaa11-99a1-4044-a950-937b484deb8e", "passwordCredentials": [], "publicClient": true, "supportsConvergence": null, "replyUrls": [ "https://myapp.azurewebsites.net/MessageRead.html" ], "requiredResourceAccess": [ { "resourceAppId": "00000003-0000-0000-c000-000000000000", "resourceAccess": [ { "id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d", "type": "Scope" } ] }, { "resourceAppId": "00000002-0000-0000-c000-000000000000", "resourceAccess": [ { "id": "311a71cc-e848-46a1-bdf8-97ff7156d8e6", "type": "Scope" }, { "id": "a42657d6-7f20-40e3-b6f0-cee03008a62a", "type": "Scope" } ] }, { "resourceAppId": "00000002-0000-0ff1-ce00-000000000000", "resourceAccess": [ { "id": "2e83d72d-8895-4b66-9eea-abb43449ab8b", "type": "Scope" }, { "id": "ab4f2b77-0b06-4fc1-a9de-02113fc2ab7c", "type": "Scope" }, { "id": "5eb43c10-865a-4259-960a-83946678f8dd", "type": "Scope" }, { "id": "3b5f3d61-589b-4a3c-a359-5dd4b5ee5bd5", "type": "Scope" } ] } ], "samlMetadataUrl": null }

Я также не забыл добавить URL-адреса авторизации в манифест моей надстройки:

<AppDomains>
 <AppDomain>https://login.windows.net</AppDomain>
 <AppDomain>https://login.microsoftonline.com</AppDomain>
</AppDomains>

Это код, который я использую в надстройке для аутентификации с помощью office-js-helpers:

    // The Office initialize function must be run each time a new page is loaded.
Office.initialize = function(reason) {
    $(document).ready(function () {

        // Determine if we are running inside of an authentication dialog
        // If so then just terminate the running function

        if (OfficeHelpers.Authenticator.isAuthDialog()) {
            // Adding code here isn't guaranteed to run as we need to close the dialog
            // Currently we have no realistic way of determining when the dialog is completely
            // closed.
            return;
        }

        // Create a new instance of Authenticator
        var authenticator = new OfficeHelpers.Authenticator();

        authenticator.endpoints.registerAzureADAuth('a11aaa11-1a5c-484a-b1d6-86c298e8f250', 'mytenant.onmicrosoft.com');

        // Add event handler to the button
        $('#login').click(function () {
            $('#token', window.parent.document).text('Authenticating...');

            authenticator.authenticate('AzureAD', true)
                .then(function (token) {
                    // Consume and store the acess token
                    $('#token', window.parent.document).text(prettify(token));
                    authToken = token.access_token;
                })
                .catch(function (error) {
                    // Handle the error
                    $('#token', window.parent.document).text(prettify(error));
                });
        });
    });
};

Теперь код в надстройке может правильно войти в систему и запросить необходимые разрешения, но после нажатия кнопки Принять на этапе авторизации приложения возвращается следующая ошибка:

AADSTS50011: ответный адрес "https://mywebapp.azurewebsites.net" не соответствует адресам для ответа, настроенным для приложение: 'a11aaa11-1a5c-484a-b1d6-86c298e8f250'. Подробнее: не указано

Ошибка теперь возвращается каждый раз, когда я нажимаю кнопку «Войти» (пользователю больше не предлагается войти в систему). Он так и не получил токен. Полный URL-адрес авторизации:

https://login.windows.net/mydomain.onmicrosoft.com/oauth2/authorize?response_type=token&client_id=a11aaa11-484a-b1d6-86c298e8f250&redirect_uri=https%3A%2F%2Fmywebps.NET%3A%2F%2Fgraph.microsoft.com&state=982599964&nonce=3994725115

Что я делаю неправильно? Может ли проблема быть связана с тем, что имя узла веб-приложения (URI перенаправления) не соответствует домену клиента Azure AD, на котором размещена регистрация приложения? Если да, как я могу предоставить разрешения для Exchange Online из моей подписки Azure, в которой размещено веб-приложение, в котором нет Office 365 или Exchange Online? Придется ли мне добавить подписку Azure в мой тестовый клиент Office 365, чтобы он также мог размещать веб-приложение?


person Eric Legault    schedule 14.11.2017    source источник


Ответы (1)


Из манифеста вашего приложения я обнаружил, что вы использовали https://myapp.azurewebsites.net/MessageRead.html как один из replyUrls. А ниже указан URL-адрес, который вы используете для получения согласия от пользователя.

https://login.windows.net/mydomain.onmicrosoft.com/oauth2/authorize?response_type=token&client_id=a11aaa11-484a-b1d6-86c298e8f250&redirect_uri=https%3A%2F%2Fmywebps.NET%3A%2F%2Fgraph.microsoft.com&state=982599964&nonce=3994725115.

Если вы заметили вышеуказанный URL, вы упомянули redirect_uri как https://myapp.azurewebsites.net. Но redirect_uri должен совпадать хотя бы с одним из replyUrls, упомянутых вами в манифесте приложения.

Попробуйте заменить https://myapp.azurewebsites.net на https://myapp.azurewebsites.net/MessageRead.html в URL-адресе авторизации.

Я обновил их по указанному ниже URL-адресу, если вы хотите, вы можете попробовать напрямую по указанному ниже URL-адресу.

https://login.windows.net/mydomain.onmicrosoft.com/oauth2/authorize?response_type=token&client_id=a11aaa11-484a-b1d6-86c298e8f250&redirect_uri=https%3A%2F%2Fmyweessage.netapp..html&resource=https%3A%2F%2Fgraph.microsoft.com&state=982599964&nonce=3994725115

person MK446    schedule 14.11.2017
comment
К сожалению, я не могу изменить URL-адрес - это делается внутри office-js-helpers. Я только что заметил, что URL-адрес был в ошибке, возвращенной из диалогового окна аутентификации, глубже в трассировке исключения - person Eric Legault; 14.11.2017
comment
Не могли бы вы обновить значение replyUrl до myapp.azurewebsite.net в манифесте приложения и проверить? - person MK446; 14.11.2017
comment
Если я использую этот URL (без /MessageRead.html), аутентификатор всплывающего окна открывается на пустую страницу, поскольку у меня нет корневой страницы. - person Eric Legault; 14.11.2017
comment
Я просмотрел документацию по офисному js-помощнику и обнаружил, что корневой URL-адрес веб-сайта будет автоматически использоваться в качестве URL-адреса перенаправления. Можете ли вы сопоставить свой корневой URL-адрес веб-сайта с каким-либо файлом html и где вы можете включить функцию аутентификации - person MK446; 14.11.2017
comment
Пробовал - такая же ошибка. Возможно, мне нужно сбросить процесс аутентификации до такой степени, что пользователю будет предложено снова войти в систему, но я не могу понять, как это сделать. Нажатие кнопки входа открывает страницу авторизации (не с моего веб-сервера), но показывает ту же ошибку, что и в моем сообщении. Я постараюсь связаться с командой office-js-helpers по их репозиторию GitHub. - person Eric Legault; 14.11.2017