Не удается получить токен при входе в Azure Active Directory с помощью msal.js

У меня проблема с получением токена при входе в Azure Active Directory с помощью msal.js.

Возможно, я опишу вам, как приложение работает в нескольких ситуациях.

I. Автоматический вход с проверкой подлинности Active Directory отключен. Обратный вызов на портале регистрации приложений настроен на домашнюю страницу приложения. Я использовал код из https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/devApps/VanillaJSTestApp/index_LoginPopup.html

  1. Войти в приложение без авторизации
  2. Нажмите кнопку, которая запускает loginPopup, после входа в систему получите токен.

Все работает, но мне нужна авторизация с помощью проверки подлинности Active Directory

II. Автоматический вход с проверкой подлинности Active Directory включен. Обратный вызов на портале регистрации приложений установлен на "***. Auth / login / aad / callback". Я использовал код из https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/devApps/VanillaJSTestApp/index_LoginPopup.html

  1. Войдите в приложение с авторизацией и войдите в систему с аутентификацией Active Directory.
  2. AcquireTokenSilent отправляет ошибку типа «user_login_error: Требуется логин пользователя».
  3. Нажмите кнопку, которая запускает loginPopup, после входа я получаю сообщение об ошибке типа «Адрес ответа **** не совпадает с адресами ответа, настроенными для приложения».

ОБНОВЛЕНИЕ: после установки userAgentApplication.redirectUri = '**** /. auth / login / aad / callback' и запуска loginPopup токен доставляется, но по-прежнему выполняется двойной вход.

Подводя итог, после входа в Azure я получаю сообщение об ошибке от acquTokenSilent «user_login_error: требуется вход пользователя».

III. Я хочу, чтобы приложение работало следующим образом:

  1. Войдите в приложение с авторизацией и войдите в систему с аутентификацией Active Directory.
  2. Получить токен

Могу я сделать это так?


person tmszyman    schedule 08.09.2017    source источник
comment
Адрес ответа **** не соответствует адресам ответа, настроенным для приложения. Эта ошибка означает, что в конфигурации вашего приложения возникла проблема. Убедитесь, что ваш URL-адрес ответа правильный. Можете ли вы поделиться деталями конфигурации вашего приложения и точной информацией об ошибке, которую вы получаете?   -  person Shawn Tabrizi    schedule 08.09.2017
comment
Эта ошибка возникает из-за того, что URL-адрес ответа установлен на Azure Active Directory (/.auth/login/aad/callback), который я хочу использовать для авторизации. Когда URL-адрес ответа установлен на приложение домашней страницы, loginPopup работает, но я не хочу этого. Я хочу получить токен после входа в систему с проверкой подлинности Active Directory.   -  person tmszyman    schedule 09.09.2017
comment
Вам необходимо убедиться, что URL-адрес ответа, с которым вы хотите работать, также правильно установлен при регистрации приложения. Похоже, у вас настроена домашняя страница для регистрации приложения, но не конечная точка обратного вызова.   -  person Shawn Tabrizi    schedule 09.09.2017
comment
Конечная точка /.auth/login/aad/callback устанавливается при регистрации приложения.   -  person tmszyman    schedule 09.09.2017
comment
Не очень ясно, в чем ваша проблема, но похоже, что ваша проблема заключается в следующем: вы вызываете loginPopup, а затем пользователю предлагается войти в систему, затем вы вызываете acquireTokenSilent, и он не работает с user_login_error: Требуется вход в систему? - это твоя проблема? Если да, не могли бы вы добавить исходный код звонков? Другой вопрос: какую область вы запрашиваете для своих loginPopup и AcquireTokenPopup?   -  person Andre Teixeira    schedule 12.09.2017
comment
Я также предполагаю, что /.auth/login/aad/callback также является страницей / URL-адресом, на котором работает ваш JavaScript SPA.   -  person Andre Teixeira    schedule 12.09.2017


Ответы (2)


Вы смешивали Easy Auth и защиту сайта вручную с помощью MSAL.

Если вы хотите, чтобы всплывающая страница для входа в систему с помощью всплывающего окна Azure Active Directory автоматически, вы можете изменить источник, чтобы добавить функцию для выполнения метода loginPopup(), когда документ полностью загружен. Вот пример кода для справки:

<html>
<head>
    <title>authentication with Msal.js app</title>
    <style>
        .hidden {
            visibility: hidden
        }

        .visible {
            visibility: visible
        }
    </style>
</head>
<body>
    <!-- bluebird only needed if this page needs to run on Internet Explorer -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.3.4/bluebird.min.js" class="pre"></script> 
    <script src="https://secure.aadcdn.microsoftonline-p.com/lib/0.1.1/js/msal.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js" class="pre"></script>

    <h1>Sending an email with msal.js and Microsoft Graph</h1>
    <div>
        <div id="label">Sign-in with Microsoft</div>
        <button id="auth" onclick="loginPopup();">Login (with Popup)</button>
    </div>
    <div id="sendEmail" class="hidden">
        <input id="emailToSendTo" type="text" />
        <button id="auth" onclick="sendEmail();">Send email</button>
    </div>

    <pre class="response"></pre>

    <script class="pre">
        var applicationConfig = {
            clientID: '1e6af2ed-686c-4914-96ed-0cd7b1673cbb',
            graphEndpoint: "https://graph.microsoft.com/v1.0/me/sendMail",
            graphScopes: ["user.read", "mail.send"]
        };
    </script>

    <script>
        var userAgentApplication = new Msal.UserAgentApplication(applicationConfig.clientID, applicationConfig.authority, authCallback);
        function authCallback(errorDesc, token, error, tokenType) {
            //This function is called after loginRedirect. msal object is bound to the window object after the constructor is called.
            if (token) {
            }
            else {
                log(error + ":" + errorDesc);
            }
        }

        function loginPopup() {
            userAgentApplication.loginPopup(applicationConfig.graphScopes).then(function (idToken) {
                //Login Success
                userAgentApplication.acquireTokenSilent(applicationConfig.graphScopes).then(function (accessToken) {
                    //AcquireToken Success
                    updateUI();
                }, function (error) {
                    //AcquireToken Failure, send an interactive request.
                    userAgentApplication.acquireTokenPopup(applicationConfig.graphScopes).then(function (accessToken) {
                        updateUI();
                    }, function (error) {
                        console.log(error);
                    });
                })
            }, function (error) {
                console.log(error);
            });

        }

        function updateUI() {
            var authButton = document.getElementById('auth');
            authButton.innerHTML = 'logout';
            authButton.setAttribute('onclick', 'logout();');
            var label = document.getElementById('label');
            label.innerText = "Hello " + userAgentApplication.getUser().name + "! Please send an email with Microsoft Graph";

            // Show the email address part
            var sendEmailSpan = document.getElementById('sendEmail');
            sendEmailSpan.className = "visible";
            var emailAddress = document.getElementById('emailToSendTo');
            emailAddress.value = userAgentApplication.getUser().displayableId;
        }

        function logout() {
            // Removes all sessions, need to call AAD endpoint to do full logout
            userAgentApplication.logout();
        }

        function sendEmail() {
            userAgentApplication.acquireTokenSilent(applicationConfig.graphScopes)
                .then(function (token, error) {
                    $.ajax({
                        type: "POST",
                        contentType: "application/json",
                        dataType: 'json',
                        beforeSend: function (request) {
                            request.setRequestHeader('Authorization', 'bearer ' + token);
                        },
                        url: applicationConfig.graphEndpoint,
                        data: JSON.stringify({ 'message': getEmail(), 'saveToSentItems': true }),
                        processData: false,
                        success: function (msg) {
                            log('Mail sucessfully sent.');
                        },
                        statusCode: {
                            200: function () {
                                log('Mail sucessfully sent.');
                            },
                            202: function () {
                                log('Mail sucessfully sent.');
                            }

                        }
                    });
                });
        }

        function log(s) {
            document.body.querySelector('.response').appendChild(document.createTextNode("\n\n" + JSON.stringify(s, true, 2)));
        }

        function getEmail() {
            var email = {
                Subject: 'Welcome to Microsoft Graph development with Msal and the Microsoft Graph sample',
                Body: {
                    ContentType: 'HTML',
                    Content: getEmailContent()
                },
                ToRecipients: [
                    {
                        EmailAddress: {
                            Address: userAgentApplication.getUser().displayableId
                        }
                    }
                ]
            };
            return email;
        }

        // Get the HTMl for the email to send.
        function getEmailContent() {
            return "<html><head> <meta http-equiv=\'Content-Type\' content=\'text/html; charset=us-ascii\'> <title></title> </head><body style=\'font-family:calibri\'> <p>Congratulations " + userAgentApplication.getUser().name + ",</p> <p>This is a message from the Microsoft Graph Connect sample. You are well on your way to incorporating Microsoft Graph endpoints in your apps. </p> <h3>What&#8217;s next?</h3><ul><li>Check out <a href='https://graph.microsoft.io' target='_blank'>graph.microsoft.io</a> to start building Microsoft Graph apps today with all the latest tools, templates, and guidance to get started quickly.</li><li>Use the <a href='https://graph.microsoft.io/graph-explorer' target='_blank'>Graph explorer</a> to explore the rest of the APIs and start your testing.</li><li>Browse other <a href='https://github.com/microsoftgraph/' target='_blank'>samples on GitHub</a> to see more of the APIs in action.</li></ul> <h3>Give us feedback</h3> <ul><li>If you have any trouble running this sample, please <a href='https://github.com/microsoftgraph/angular-connect-rest-sample/issues' target='_blank'>log an issue</a>.</li><li>For general questions about the Microsoft Graph API, post to <a href='https://stackoverflow.com/questions/tagged/microsoftgraph?sort=newest' target='blank'>Stack Overflow</a>. Make sure that your questions or comments are tagged with [microsoftgraph].</li></ul><p>Thanks and happy coding!<br>Your Microsoft Graph samples development team</p> <div style=\'text-align:center; font-family:calibri\'> <table style=\'width:100%; font-family:calibri\'> <tbody> <tr> <td><a href=\'https://github.com/microsoftgraph/angular-connect-rest-sample\'>See on GitHub</a> </td> <td><a href=\'https://officespdev.uservoice.com/\'>Suggest on UserVoice</a> </td> <td><a href=\'https://twitter.com/share?text=I%20just%20started%20developing%20%23Angular%20apps%20using%20the%20%23MicrosoftGraph%20Connect%20sample!%20&url=https://github.com/microsoftgraph/angular-connect-rest-sample\'>Share on Twitter</a> </td> </tr> </tbody> </table> </div>  </body> </html>";
        };


        $(document).ready(function () {
            loginPopup();
        });
    </script>
</body>
</html>
person Fei Xue - MSFT    schedule 12.09.2017

Если вы хотите аутентифицировать пользователя клиентом с помощью msal.js, а также защитить свой веб-API, отключите «Аутентификацию службы приложений» в Azure. Вместо этого защитите свой веб-API с помощью промежуточного программного обеспечения OWIN.

В следующем примере показан веб-API, защищенный конечной точкой Azure AD V2 с помощью msal.js: https://github.com/Azure-Samples/active-directory-javascript-singlepageapp-dotnet-webapi-v2

person Andre Teixeira    schedule 12.09.2017