次の方法で共有


方法: カスタム エラー処理にエラー URL を使用する

更新日: 2015 年 6 月 19 日

適用先:Azure

適用対象

  • Microsoft Azure Active Directory アクセス制御 (アクセス制御サービスまたは ACS)

まとめ

このトピックでは、エラー URL 機能を使用して、証明書利用者アプリケーションにカスタム ログイン エラー処理を実装する方法について説明します。 エラー URL を使用すると、ACS によって生成されたエラーを証明書利用者アプリケーションに送信して、アプリケーションがエラーをログに記録して応答できるようにします。 たとえば、ASP.NET Web サイトはエラー URL 機能を使用して、Web サイトと同じ外観でブランド化されたエラー メッセージをユーザーに表示できます。

内容

  • 目標

  • 概要

  • 手順の要約

  • 手順 1 – エラー URL 機能を有効にする

  • 手順 2 – エラー ヘルパー クラスを作成する

  • 手順 3 - JSON でエンコードされたエラー メッセージを処理する

  • 手順 4 - エラー ページへの匿名アクセスを構成する

  • 手順 5 – 作業をテストする

目標

  • エラー URL 機能を使用するために必要な構成を特定します。

  • ACS からのエラー メッセージを処理するために必要なヘルパー コードを特定します。

  • 潜在的な落とし穴を特定し、トラブルシューティングを行います。

概要

エラー URL は、ログイン プロセス中にエラーが発生した場合に ACS がユーザーをリダイレクトする Web アドレスを指定します。 エラー URL ターゲットは一般に証明書利用者アプリケーションによってホストされるカスタム エラー ページです。 リダイレクトの一環として、ACS は JSON でエンコードされた HTTP URL パラメーターとして証明書利用者アプリケーションにエラーに関する情報を返します。 カスタム エラー ページに JSON でエンコードされたエラー情報を含めたり、静的なヘルプ テキストを表示したりすることができます。 次に、JSON でエンコードされたエラー メッセージの例を示します。

{"context":null,"httpReturnCode":401,"identityProvider":"Google","timeStamp":"2010-12-17 21:01:36Z","traceId":"16bba464-03b9-48c6-a248-9d16747b1515","errors":[{"errorCode":"ACS30000","errorMessage":"There was an error processing an OpenID sign-in response."},{"errorCode":"ACS50019","errorMessage":"Sign-in was canceled by the user."}]}

手順の要約

ACS エラー メッセージを処理するには、次のプロセスを使用します。

  • 手順 1 – エラー URL 機能を有効にする

  • 手順 2 – エラー ヘルパー クラスを作成する

  • 手順 3 - JSON でエンコードされたエラー メッセージを処理する

  • 手順 4 - エラー ページへの匿名アクセスを構成する

  • 手順 5 – 作業をテストする

手順 1 – エラー URL 機能を有効にする

証明書利用者のエラー URL 機能を有効にするには

  1. Microsoft Azure管理ポータル (https://manage.WindowsAzure.com) に移動し、サインインし、[Active Directory] をクリックします。 (トラブルシューティングのヒント: "Active Directory" 項目が見つからないか、使用できません)

  2. アクセス制御名前空間を管理するには、名前空間をクリックしてしてから [管理] をクリックします。 または、[アクセス制御名前空間] をクリックして名前空間を選択し、[管理] をクリックします。

  3. [証明書利用者アプリケーション] をクリックして、証明書利用者アプリケーションを選択します。

  4. [証明書利用者アプリケーションの編集] ページで、[エラー URL] フィールドにエラー ページ URL を入力します。

    ログイン エラーが発生すると、ACS はユーザーをこのページにリダイレクトします。 また、ACS は、エラーの詳細を含む JSON URL でエンコードされたパラメーターをこのページに送信します。

手順 2 – エラー ヘルパー クラスを作成する

この手順では、JSON でエンコードされたエラー メッセージのシリアル化を解除するエラー ヘルパー クラスを作成します。

エラー ヘルパー クラスを作成するには

  1. Web アプリケーションにクラス ファイルを追加し、それに Error.cs などの名前を指定します。

  2. 次のように、Error クラスを実装します。

    public class Error
    {
        public string errorCode { get; set; }
        public string errorMessage { get; set; }
    }
    

    別のクラス ファイルを追加し、 ErrorDetails.cs などの名前を付けます。

  3. 次のように、ErrorDetails クラスを実装します。

    public class ErrorDetails
    {
        public string context { get; set; }
        public int httpReturnCode { get; set; }
        public string identityProvider { get; set; }
        public Error[] errors { get; set; }
    }
    

これらのクラスは、ACS からのエラー メッセージを処理するときに、次の手順で使用されます。

手順 3 - JSON でエンコードされたエラー メッセージを処理する

この手順では、ACS によって生成される JSON でエンコードされたエラー メッセージを処理する方法を示します。

ACS によって生成された JSON でエンコードされたエラー メッセージを処理するには

  1. ASP.NET アプリケーションに ASPX Web ページを追加し、それに ErrorPage.aspx などの名前を指定します。

  2. 次のラベル コントロールを ASP.NET マークアップに追加します。

    <asp:Label ID="lblIdntityProvider" runat="server"></asp:Label> 
    <asp:Label ID="lblErrorMessage" runat="server"></asp:Label> 
    
  3. ページの分離コード ファイル ErrorPge.aspx.cs に切り替えます。

  4. 次の宣言を上部に追加します。

    using System.Web.Script.Serialization;
    
  5. 次のコードを Page_Load メソッドに追加します。

    JavaScriptSerializer serializer = new JavaScriptSerializer(); ErrorDetails error = serializer.Deserialize<ErrorDetails>( 
    
    
                                         Request["ErrorDetails"] ); lblErrorMessage.Text = string.Join("<br/>", 
                                        error.errors.Select(er => string.Format("Error Code {0}: {1}", 
                                        er.errorCode, er.errorMessage)).ToArray());
    
    

    このコードは、ACS からの JSON でエンコードされたエラー メッセージを処理します。

手順 4 - エラー ページへの匿名アクセスを構成する

この手順では ErrorPage.aspx ファイルへの匿名アクセスを構成します。 ページが保護されており、承認が必要な場合は、無限のリダイレクト ループになります。 ACS がページにアクセスしようとしたときにこれが発生した場合、ACS は JSON でエンコードされたエラーを送信します。

注意

エラー ページは匿名でアクセスでき、HTML をエコーしたり、データをデータベースに書き込むコードが含まれる可能性があるため、クロスサイト スクリプトや SQL インジェクション攻撃を防止するようにする必要があります。 次のリソースでは、これについて詳しく説明します。

エラー ページへの匿名アクセスを構成するには

  • アプリケーションで web.config を開き、次のエントリを追加します。

    <location path="ErrorPage.aspx">
      <system.web>
        <authorization>
          <allow users="*" />
        </authorization>
      </system.web>
    </location>
    

    これにより、ページへのアクセスによって、無限のリダイレクト ループが発生しません。

手順 5 – 作業をテストする

この手順では、エラー URL の構成と実装をテストします。

証明書利用者のエラー URL 機能を有効にするには

  1. Microsoft Azure管理ポータル (https://manage.WindowsAzure.com) に移動し、サインインし、[Active Directory] をクリックします。 (トラブルシューティングのヒント: "Active Directory" 項目が見つからないか、使用できません)

  2. アクセス制御名前空間を管理するには、名前空間をクリックしてしてから [管理] をクリックします。 または、[アクセス制御名前空間] をクリックして名前空間を選択し、[管理] をクリックします。

  3. [ルール グループ] をクリックし、証明書利用者アプリケーションに関連付けられているルール グループをクリックします。

  4. 警告

    次の手順は元に戻すことができません。 ただし、生成されたルールを削除すれば、それらを簡単に再度生成できます。

  5. [ルール グループの編集] ページで、[ルール] セクションのすべてのルールを選択し、[選択されたルールの削除] をクリックします。

  6. [保存] をクリックします。

  7. ブラウザーを使用して、Web サイトに戻り、いずれかのページに移動します。

  8. 認証のために ID プロバイダーにリダイレクトする必要があります (Windows Live ID (Microsoft アカウント)、Google、Facebook、Yahoo!、または証明書利用者用に ID プロバイダーとして構成されているもの)。

  9. 認証が成功した後、ACS にリダイレクトされます。ルールが定義されていないため、エラーが生成されます。

  10. このエラーは、「手順 2 - エラー ヘルパー クラスの作成」で作成したエラー ページに表示され、次のようになります。

    uri:WindowsLiveID エラー コード ACS50000: トークンの発行中にエラーが発生しました。

これをテストする別の方法は、ユーザーの同意を拒否することです。 これは、Facebook や Google を使用してログインした際に表示されます。