サイレント認証

重要

セキュリティ修正プログラムを含む Active Directory 認証ライブラリ (ADAL) の Microsoft サポートと開発は 、2022 年 6 月 30 日に終了します。 Microsoft 認証ライブラリ (MSAL) を使用してサポートを引き続き受け取るアプリケーションを更新します。 「 アプリケーションを Microsoft 認証ライブラリ (MSAL)に移行する」を参照してください

注意

モバイル クライアントでタブで認証を機能するには、JavaScript SDK バージョン 1.4.1 以降Teamsを使用してください。

サイレント認証はAzure ADトークンをサイレント 更新することで、ユーザーが資格情報を入力する回数を最小限に抑える必要があります。 シングル サインオンの真のサポートについては、SSO のドキュメント を参照してください

コードクライアント側を保持するには、JavaScript Azure AD認証ライブラリを使用して、Microsoft Azure Active Directory (Azure AD) アクセス トークンをサイレント モードで取得します。 ユーザーが最近サインインした場合、ポップアップ ダイアログ ボックスは表示されない。

Active Directory 認証ライブラリは AngularJS アプリケーション用に最適化されています。JavaScript シングル ページ アプリケーション (SPA) でも機能します。

注意

現在、サイレント認証はタブでのみ機能します。 ボットからサインインしても機能しません。

サイレント認証の仕組み

Active Directory 認証ライブラリは、OAuth 2.0 暗黙的な付与フロー用の非表示の iframe を作成します。 ただし、ライブラリは 、prompt=noneサインイン Azure ADページを表示しないので、指定します。 ユーザーがサインインするか、アプリケーションへのアクセスを許可する必要がある場合は、ユーザーの操作が必要になる場合があります。 ユーザーの操作が必要な場合Azure AD、ライブラリがアプリに報告するエラーが返されます。 必要に応じて、アプリにサインイン オプションを表示できます。

サイレント認証を実行する方法

この記事のコードは、認証サンプル ノードTeamsサンプル アプリTeamsから来ます

[サイレント認証] タブと [簡易認証構成可能] Azure ADを開始し、指示に従ってローカル コンピューターでサンプルを実行します。

Active Directory 認証ライブラリを含め、構成する

Active Directory 認証ライブラリをタブ ページに含め、クライアント ID とリダイレクト 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>

ユーザー コンテキストの取得

タブのコンテンツ ページで、現在 microsoftTeams.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)び出すことによって、ユーザーからの結果を解析します。

有効なユーザーを持ち、電話をかmicrosoftTeams.authentication.notifySuccess()``microsoftTeams.authentication.notifyFailure()けられているか、メイン タブのコンテンツ ページに状態を報告してください。

if (authContext.isCallback(window.location.hash)) {
    authContext.handleWindowCallback(window.location.hash);
    if (window.parent === window) {
        if (authContext.getCachedUser()) {
            microsoftTeams.authentication.notifySuccess();
        } else {
            microsoftTeams.authentication.notifyFailure(authContext.getLoginError());
        }
    }
}

サインアウト フローの処理

次のコードを使用して、認証のサインアウト フローをAzure ADします。

注意

タブまたはボットからTeamsすると、現在のセッションがクリアされます。

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

関連項目