このドキュメントはアーカイブされており、メンテナンスされていません。

方法: WIF および ACS を使用して要求対応の ASP.NET アプリケーションで要求承認を実装する

発行: 2011年4月

更新日: 2015年6月

適用対象: Azure

  • Microsoft® Azure™ Access Control Service (ACS)

  • Windows® Identity Foundation (WIF)

  • ASP.NET

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

  • 目標

  • 概要

  • 手順の概要

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

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

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

  • 関連項目

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

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

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

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

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

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

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

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

  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 フォルダーにドロップする必要があります。

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

  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" >
    
    

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

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


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

表示: