次の方法で共有


Web 認証ブローカー

この記事では、OpenID や OAuth などの認証プロトコルを使用するオンライン ID プロバイダーにユニバーサル Windows プラットフォーム (UWP) アプリを接続する方法について説明します。 AuthenticateAsync メソッドは、オンライン ID プロバイダーに要求を送信し、アプリがアクセスできるプロバイダー リソースを記述するアクセス トークンを取得します。

完全に動作するコード サンプルについては、 GitHub で WebAuthenticationBroker リポジトリを複製します

 

オンライン プロバイダーにアプリを登録する

接続するオンライン ID プロバイダーにアプリを登録する必要があります。 ID プロバイダーからアプリを登録する方法を確認できます。 登録後、通常、オンライン プロバイダーはアプリの ID または秘密鍵を提供します。

認証要求 URI を作成する

要求 URI は、認証要求をオンライン プロバイダーに送信するアドレスと、アプリ ID やシークレットなどの他の必要な情報、認証完了後にユーザーが送信されるリダイレクト URI、予想される応答の種類で構成されます。 必要なパラメーターをプロバイダーから確認できます。

要求 URI は、AuthenticateAsync メソッドの requestUri パラメーターとして送信されます。 セキュリティで保護されたアドレスである必要があります ( https://で始まる必要があります)

次の例は、要求 URI を構築する方法を示しています。

string startURL = "https://<providerendpoint>?client_id=<clientid>&scope=<scopes>&response_type=token";
string endURL = "http://<appendpoint>";

System.Uri startURI = new System.Uri(startURL);
System.Uri endURI = new System.Uri(endURL);

オンライン プロバイダーに接続する

AuthenticateAsync メソッドを呼び出して、オンライン ID プロバイダーに接続し、アクセス トークンを取得します。 このメソッドでは、前の手順で作成した URI を requestUri パラメーターとして受け取り、ユーザーがリダイレクトされる目的の URI を callbackUri パラメーターとして指定します。

string result;

try
{
    var webAuthenticationResult = 
        await Windows.Security.Authentication.Web.WebAuthenticationBroker.AuthenticateAsync( 
        Windows.Security.Authentication.Web.WebAuthenticationOptions.None, 
        startURI, 
        endURI);

    switch (webAuthenticationResult.ResponseStatus)
    {
        case Windows.Security.Authentication.Web.WebAuthenticationStatus.Success:
            // Successful authentication. 
            result = webAuthenticationResult.ResponseData.ToString(); 
            break;
        case Windows.Security.Authentication.Web.WebAuthenticationStatus.ErrorHttp:
            // HTTP error. 
            result = webAuthenticationResult.ResponseErrorDetail.ToString(); 
            break;
        default:
            // Other error.
            result = webAuthenticationResult.ResponseData.ToString(); 
            break;
    } 
}
catch (Exception ex)
{
    // Authentication failed. Handle parameter, SSL/TLS, and Network Unavailable errors here. 
    result = ex.Message;
}

Warnung

AuthenticateAsync に加えて、Windows.Security.Authentication.Web 名前空間には AuthenticateAndContinue メソッドが含まれています。 このメソッドは呼び出さないでください。 Windows Phone 8.1 のみを対象とするアプリ向けに設計されており、Windows 10 以降では非推奨となっています。

シングル サインオン (SSO) を使用した接続。

既定では、Web 認証ブローカーは Cookie の永続化を許可しません。 このため、(たとえば、プロバイダーのログイン ダイアログでチェック ボックスをオンにするなどして) アプリ ユーザーがログインを維持することを示した場合でも、そのプロバイダーのリソースにアクセスするたびにログインする必要があります。 SSO を使用してログインするには、オンライン ID プロバイダーで Web 認証ブローカーの SSO が有効になっている必要があり、アプリは callbackUri パラメーターを受け取らない AuthenticateAsync のオーバーロードを呼び出す必要があります。 これにより、永続化された Cookie を Web 認証ブローカーによって保存できるため、同じアプリによる今後の認証呼び出しでは、ユーザーによるサインインが繰り返し必要なくなります (アクセス トークンの有効期限が切れるまで、ユーザーは実質的に "ログイン" されます)。

SSO をサポートするには、オンライン プロバイダーが ms-app://<appSID>形式でリダイレクト URI を登録できるようにする必要があります。ここで、 <appSID> はアプリの SID です。 アプリの SID は、アプリのアプリ開発者ページから、または GetCurrentApplicationCallbackUri メソッドを呼び出すことによって見つけることができます。

string result;

try
{
    var webAuthenticationResult = 
        await Windows.Security.Authentication.Web.WebAuthenticationBroker.AuthenticateAsync( 
        Windows.Security.Authentication.Web.WebAuthenticationOptions.None, 
        startURI);

    switch (webAuthenticationResult.ResponseStatus)
    {
        case Windows.Security.Authentication.Web.WebAuthenticationStatus.Success:
            // Successful authentication. 
            result = webAuthenticationResult.ResponseData.ToString(); 
            break;
        case Windows.Security.Authentication.Web.WebAuthenticationStatus.ErrorHttp:
            // HTTP error. 
            result = webAuthenticationResult.ResponseErrorDetail.ToString(); 
            break;
        default:
            // Other error.
            result = webAuthenticationResult.ResponseData.ToString(); 
            break;
    } 
}
catch (Exception ex)
{
    // Authentication failed. Handle parameter, SSL/TLS, and Network Unavailable errors here. 
    result = ex.Message;
}

デバッグ

Web 認証ブローカー API のトラブルシューティングには、運用ログの確認、Fiddler を使用した Web 要求と応答の確認など、いくつかの方法があります。

操作ログ

多くの場合、操作ログを使用して、動作していないものを特定できます。 Web サイト開発者が Web 認証ブローカーによって Web ページがどのように処理されているかを理解できるようにする専用のイベント ログ チャネル Microsoft-Windows-WebAuth\Operational があります。 これを有効にするには、eventvwr.exe を起動し、Application and Services\Microsoft\Windows\WebAuth で操作ログを有効にします。 また、Web 認証ブローカーは、ユーザー エージェント文字列に一意の文字列を追加して、Web サーバー上で自身を識別します。 文字列は "MSAuthHost/1.0" です。 バージョン番号は将来変更される可能性があるため、コードでそのバージョン番号に依存しないようにしてください。 完全なユーザー エージェント文字列の後に完全なデバッグ手順が続く例を次に示します。

User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; MSAuthHost/1.0)

  1. 操作ログを有効にします。
  2. Contoso ソーシャル アプリケーションを実行します。 Web 認証操作ログを表示するイベント ビューアー
  3. 生成されたログ エントリを使用して、Web 認証ブローカーの動作をより詳細に把握できます。 この場合、次のような場合があります。
    • ナビゲーションの開始: AuthHost が開始されるとログに記録され、開始 URL と終了 URL に関する情報が含まれます。
    • ナビゲーションの開始 の詳細を示します
    • ナビゲーション完了: Web ページの読み込みの完了をログに記録します。
    • メタ タグ: 詳細を含むメタタグが検出されたときにログを記録します。
    • ナビゲーションの終了: ユーザーによって終了されたナビゲーション。
    • ナビゲーション エラー: AuthHost は、HttpStatusCode を含む URL でナビゲーション エラーを検出します。
    • ナビゲーション終了: 終了 URL が見つかりました。

フィドラー

Fiddler Web デバッガーは、アプリで使用できます。 詳細については、 Fiddler のドキュメントを参照してください。

  1. AuthHost は独自のアプリ コンテナーで実行されるため、プライベート ネットワーク機能を提供するには、レジストリ キー (Windows レジストリ エディター バージョン 5.00) を設定する必要があります。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\イメージ ファイルの実行オプション\authhost.exe\EnablePrivateNetwork = 00000001

    このレジストリ キーがない場合は、管理者特権でコマンド プロンプトで作成できます。

    REG ADD "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\authhost.exe" /v EnablePrivateNetwork /t REG_DWORD /d 1 /f
    
  2. AuthHostが送信トラフィックを生成しているため、そのための規則を追加します。

    CheckNetIsolation.exe LoopbackExempt -a -n=microsoft.windows.authhost.a.p_8wekyb3d8bbwe
    CheckNetIsolation.exe LoopbackExempt -a -n=microsoft.windows.authhost.sso.p_8wekyb3d8bbwe
    CheckNetIsolation.exe LoopbackExempt -a -n=microsoft.windows.authhost.sso.c_8wekyb3d8bbwe
    D:\Windows\System32>CheckNetIsolation.exe LoopbackExempt -s
    List Loopback Exempted AppContainers
    [1] -----------------------------------------------------------------
        Name: microsoft.windows.authhost.sso.c_8wekyb3d8bbwe
        SID:  S-1-15-2-1973105767-3975693666-32999980-3747492175-1074076486-3102532000-500629349
    [2] -----------------------------------------------------------------
        Name: microsoft.windows.authhost.sso.p_8wekyb3d8bbwe
        SID:  S-1-15-2-166260-4150837609-3669066492-3071230600-3743290616-3683681078-2492089544
    [3] -----------------------------------------------------------------
        Name: microsoft.windows.authhost.a.p_8wekyb3d8bbwe
        SID:  S-1-15-2-3506084497-1208594716-3384433646-2514033508-1838198150-1980605558-3480344935
    
  3. 受信トラフィックのファイアウォール規則を Fiddler に追加します。