Share via


方法: WIF と ACS を使用してクレーム対応 ASP.NET アプリケーションに要求承認を実装する

更新日: 2015 年 6 月 19 日

適用先:Azure

適用対象

  • Microsoft® Azure™ Access Control Service (ACS)

  • Windows® Identity Foundation (WIF)

  • ASP.NET

まとめ

このトピックでは、WIF と ACS を使用して、要求に対応する ASP.NET Web アプリケーションに要求ベースのAccess Control (CBAC) 承認を実装する方法について説明します。

内容

  • 目標

  • 概要

  • 手順の要約

  • 手順 1 – 要求承認ライブラリを実装する

  • 手順 2 – 要求承認ライブラリを使用するように ASP.NET アプリケーションを構成する

  • 手順 3 – 承認ポリシーを構成する

  • 関連項目

目標

  • 承認ロジックをアプリケーションから外部化する。

  • ロール以外にも承認チェックを行って、承認をより詳細に制御できるようにする。

  • ポリシーに基づく宣言型の承認管理を提供する。

概要

要求承認は、トークン (要求) 内に示されている情報の使用に基づきます。 要求承認は、ロールのみに基づいて承認決定を行うのが不十分である場合に役立ちます。 たとえば、金融アプリケーションでは、保有期間と他の属性に基づく口座振替に関する異なる制限に同じロールを割り当てることができます。 このような属性はロールと同様に要求形式である場合があるため、よりきめ細かな承認決定を可能にします。

手順の要約

  • 手順 1 – 要求承認ライブラリを実装する

  • 手順 2 – 要求承認ライブラリを使用するように ASP.NET アプリケーションを構成する

  • 手順 3 – 承認ポリシーを構成する

手順 1 – 要求承認ライブラリを実装する

この手順では、構成ファイルからアクセス ポリシーを読み取り、アクセス確認を適用する外部クラス ライブラリを作成する方法を示します。 以下のサンプルは、郵便番号要求に基づいて承認決定を行う要求承認ライブラリの実装方法を示しています。

要求承認ライブラリを実装するには

  1. 管理者モードで Visual Studio® を実行していることを確認します。

  2. ソリューション エクスプローラーで必要なソリューションを右クリックし、新しいクラス ライブラリ プロジェクトを追加してから、MyClaimsAuthorizationManager などの名前を付けます。

  3. 既定のクラス Class1.cs を削除します。

  4. 新しいクラスを追加して、ZipClaimsAuthorizationManager などの名前を付けます。 これで、郵便番号に基づく承認が実装されます。

  5. Microsoft.IdentityModel アセンブリと System.Web アセンブリへの参照を追加します。

  6. 次の宣言を追加します。

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. AccessCheck メソッドをオーバーライドしてから、コンストラクターを ZipClaimsAuthorizationManager クラスに対して実装して、ClaimsAuthorizationManager クラスを拡張します。 コードは次のように表示されます。

    namespace MyClaimsAuthorizationManager 
    { 
        class ZipClaimsAuthorizationManager : ClaimsAuthorizationManager 
        { 
            private static Dictionary<string, int> m_policies = new Dictionary<string, int>(); 
    
            public ZipClaimsAuthorizationManager(object config) 
            { 
                XmlNodeList nodes = config as XmlNodeList; 
                foreach (XmlNode node in nodes) 
                { 
                    { 
                        //FIND ZIP CLAIM IN THE POLICY IN WEB.CONFIG AND GET ITS VALUE 
                        //ADD THE VALUE TO MODULE SCOPE m_policies 
                        XmlTextReader reader = new XmlTextReader(new StringReader(node.OuterXml)); 
                        reader.MoveToContent(); 
                        string resource = reader.GetAttribute("resource"); 
                        reader.Read(); 
                        string claimType = reader.GetAttribute("claimType"); 
                        if (claimType.CompareTo(ClaimTypes.PostalCode) == 0) 
                        { 
                            throw new ArgumentNullException("Zip Authorization is not specified in policy in web.config"); 
                        } 
                        int zip = -1; 
                        bool success = int.TryParse(reader.GetAttribute("Zip"),out zip); 
                        if (!success) 
                        { 
                            throw new ArgumentException("Specified Zip code is invalid - check your web.config"); 
                        } 
                        m_policies[resource] = zip; 
                    } 
                } 
            } 
            public override bool CheckAccess(AuthorizationContext context) 
            { 
                //GET THE IDENTITY 
                //FIND THE POSTALCODE CLAIM'S VALUE IN IT 
                //COMPARE WITH THE POLICY 
                int allowedZip = -1; 
                int requestedZip = -1; 
                Uri webPage = new Uri(context.Resource.First().Value); 
                IClaimsPrincipal principal = (IClaimsPrincipal)HttpContext.Current.User; 
                if (principal == null) 
                { 
                    throw new InvalidOperationException("Principal is not populate in the context - check configuration"); 
                } 
                IClaimsIdentity identity = (IClaimsIdentity)principal.Identity; 
                if (m_policies.ContainsKey(webPage.PathAndQuery)) 
                { 
                    allowedZip = m_policies[webPage.PathAndQuery]; 
                    requestedZip = -1; 
                    int.TryParse((from c in identity.Claims 
                                            where c.ClaimType == ClaimTypes.PostalCode 
                                            select c.Value).FirstOrDefault(), out requestedZip); 
                } 
                if (requestedZip!=allowedZip) 
                { 
                    return false; 
                } 
                return true; 
            } 
        } 
    }
    
  8. ソリューションをコンパイルして、コンパイル エラーがないことを確認します。

  9. コンパイルされたライブラリ (この場合は MyClaimsAuthorizationManager.dll) を見つけます。 これを、ASP.NET Web アプリケーションの bin フォルダーにドロップする必要があります。

手順 2 – 要求承認ライブラリを使用するように ASP.NET アプリケーションを構成する

次の手順は ASP.NET Web アプリケーションで実行されます。 前の手順で作成した要求承認マネージャー ライブラリへの参照は追加しないでください。 web.config の場合を除き、ASP.NET Web アプリケーションがそれを「認識する必要はありません」。

要求承認ライブラリを使用するように ASAP.NET アプリケーションを構成するには

  1. WIF の ClaimsAuthorizationModule をそのパイプラインに含めるように ASP.NET Web アプリケーションを構成します。その場合、web.config の HttpModules セクションに次のエントリを追加します (Visual Studio に付属の開発 Web サーバーで有効なもの。インターネット インフォメーション サービス (IIS) バージョン 7 の場合、この構成は system.webServer ノードの下のモジュール セクションにあるはずです)。

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. microsoft.identityModel.service ノードに次のエントリを追加して、前の手順で実装したカスタム承認ライブラリを使用するように ASP.NET Web アプリケーションを構成します。

    <claimsAuthorizationManager type="MyClaimsAuthorizationManager.ZipClaimsAuthorizationManager, MyClaimsAuthorizationManager" >
    

手順 3 – 承認ポリシーを構成する

このトピックでは、構成ポリシーは ASP.NET Web アプリケーションの web.config ファイルに示されています。 ポリシーは、要求の種類とその値にリソースをマップする単純なルールを示します。 たとえば、以下のポリシーは、前の手順で作成および構成したカスタム承認ライブラリでの読み取りおよび適用が可能です。 前の手順で構成した claimsAuthorizationManager ノードに次のエントリを追加します。

<policy resource="/default.aspx">
  <claim claimType=https://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode
  Zip="11111" />
</policy>

上記のポリシーでは、default.aspx ページにアクセスするためには、受け取ったトークンに値が 11111 の郵便番号要求を含める必要があることが要求されます。