Использование автоматической проверки подлинности в Azure AD

Важно!

Поддержка и разработка библиотек проверки подлинности Active Directory (ADAL) со стороны Майкрософт, включая исправления в области безопасности, заканчивается 30 июня 2022 г. Чтобы продолжить получать поддержку, обновите приложения, чтобы использовать библиотеку проверки подлинности Майкрософт (MSAL). См . раздел "Перенос приложений в библиотеку проверки подлинности Майкрософт (MSAL)".

Примечание

Для проверки подлинности на вкладке на мобильных клиентах убедитесь, что вы используете пакет SDK для JavaScript Teams версии 1.4.1 или более поздней.

Автоматическая проверка подлинности в Azure AD минимизирует количество вводов учетных данных пользователем путем незаметного обновления маркера проверки подлинности. Сведения о поддержке единого входа см. в документации по единому входу.

Чтобы сохранить код на стороне клиента, используйте библиотеку проверки подлинности Azure AD для JavaScript, чтобы автоматически получить маркер доступа Microsoft Azure Active Directory (Azure AD). Если пользователь недавно выполнил вход, всплывающее диалоговое окно не отображается.

Хотя библиотека проверки подлинности Active Directory оптимизирована для приложений AngularJS, она также работает с одностраничными приложениями (SPA) JavaScript.

Примечание

В настоящее время автоматическая проверка подлинности работает только для вкладок. Она не работает при входе из бота.

Принцип работы автоматической проверки подлинности

Библиотека проверки подлинности Active Directory создает скрытый iframe для потока неявного предоставления OAuth 2.0. При этом библиотека указывает prompt=none, так что Azure AD не отображает страницу входа. Взаимодействие с пользователем может потребоваться, если пользователю необходимо войти или предоставить доступ к приложению. Если требуется взаимодействие с пользователем, Azure AD возвращает ошибку, которую библиотека сообщает приложению. При необходимости в приложении теперь можно отобразить параметр входа.

Как выполнить автоматическую проверку подлинности

Код, приведенный в этой статье, получен из примера приложения Teams, которое представляет собой пример узла проверки подлинности Teams.

Инициируйте автоматическую и простую настраиваемую вкладку проверки подлинности с помощью Azure AD и следуйте инструкциям по запуску примера на вашем локальном компьютере.

Включение и настройка библиотеки проверки подлинности Active Directory

Включите библиотеку проверки подлинности Active Directory на страницах вкладок и настройте ее с помощью идентификатора клиента и URL-адреса перенаправления:

<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.15/js/adal.min.js" integrity="sha384-lIk8T3uMxKqXQVVfFbiw0K/Nq+kt1P3NtGt/pNexiDby2rKU6xnDY8p16gIwKqgI" crossorigin="anonymous"></script>
<script type="text/javascript">
    // Active Directory Authentication Library configuration
    let config = {
        clientId: "YOUR_APP_ID_HERE",
        // redirectUri must be in the list of redirect URLs for the Azure AD app
        redirectUri: window.location.origin + "/tab-auth/silent-end",
        cacheLocation: "localStorage",
        navigateToLoginRequestUrl: false,
    };
</script>

Получить пользовательский контекст

На странице содержимого вкладки вызовите app.getContext(), чтобы получить подсказку для входа для текущего пользователя. Подсказка используется в качестве loginHint в вызове Azure AD.

// Set up extra query parameters for Active Directory Authentication Library
// - openid and profile scope adds profile information to the id_token
// - login_hint provides the expected user name
if (loginHint) {
    config.extraQueryParameter = "scope=openid+profile&login_hint=" + encodeURIComponent(loginHint);
} else {
    config.extraQueryParameter = "scope=openid+profile";
}

Проверка подлинности

Если в библиотеке проверки подлинности Active Directory есть неиспользуемый маркер, кэшированный для пользователя, используйте этот маркер. Как вариант, вызовите acquireToken(resource, callback) для автоматического получения маркера. Библиотека вызывает функцию обратного вызова с запрошенным маркером или создает ошибку в случае сбоя проверки подлинности.

Если в функции обратного вызова возникает ошибка, отобразите и используйте параметр явного входа.

let authContext = new AuthenticationContext(config); // from Active Directory Authentication Library
// See if there is a cached user and it matches the expected user
let user = authContext.getCachedUser();
if (user) {
    if (user.profile.oid !== userObjectId) {
        // User doesn't match, clear the cache
        authContext.clearCache();
    }
}

// In this example we are getting an id token (which Active Directory Authentication Library returns if we ask for resource = clientId)
authContext.acquireToken(config.clientId, function (errDesc, token, err, tokenType) {
    if (token) {
        // Make sure Active Directory Authentication Library gave us an ID token
        if (tokenType !== authContext.CONSTANTS.ID_TOKEN) {
            token = authContext.getCachedToken(config.clientId);
        }
        showProfileInformation(idToken);
    } else {
        console.log("Renewal failed: " + err);
        // Failed to get the token silently; show the login button
        showLoginButton();
        // You could attempt to launch the login popup here, but in browsers this could be blocked by
        // a popup blocker, in which case the login attempt will fail with the reason FailedToOpenWindow.
    }
});

Обработка возвращаемого значения

Библиотека проверки подлинности Active Directory анализирует результат Azure AD путем вызова AuthenticationContext.handleWindowCallback(hash) на странице обратного вызова для входа.

Убедитесь, что у вас есть подходящий пользователь, и вызовите authentication.notifySuccess() или authentication.notifyFailure(), чтобы сообщить о состоянии на главной странице содержимого вкладки.

import { authentication } from "@microsoft/teams-js";
if (authContext.isCallback(window.location.hash)) {
    authContext.handleWindowCallback(window.location.hash);
    if (window.parent === window) {
        if (authContext.getCachedUser()) {
            authentication.notifySuccess();
        } else {
            authentication.notifyFailure(authContext.getLoginError());
        }
    }
}

Обработка потока выходов

Используйте следующий код для обработки потока выходов при проверке подлинности Azure AD:

Примечание

При выходе из вкладки Teams или из бота текущий сеанс сбрасывается.

function logout() {
localStorage.clear();
window.location.href = "@Url.Action("<<Action Name>>", "<<Controller Name>>")";
}

Дополнительные ресурсы