Aracılığıyla paylaş


Nasıl yapılır: WIF ve ACS Kullanarak Talep Kullanan ASP.NET Uygulamada Talep Yetkilendirmesi Uygulama

Güncelleştirme: 19 Haziran 2015

Şunlar için geçerlidir: Azure

Uygulanan Öğe

  • Microsoft® Azure™ Access Control Hizmeti (ACS)

  • ® Windows Identity Foundation (WIF)

  • ASP.NET

Özet

Bu konuda, WIF ve ACS kullanarak talep kullanan ASP.NET web uygulamalarında Talep Tabanlı Access Control (CBAC) yetkilendirmenin nasıl uygulandığı açıklanmaktadır.

İçindekiler

  • Hedefler

  • Genel Bakış

  • Adımların Özeti

  • 1. Adım – Talep Yetkilendirme Kitaplığı Uygulama

  • 2. Adım : Talep Yetkilendirme Kitaplığını Kullanmak için bir ASP.NET Uygulaması Yapılandırma

  • 3. Adım – Yetkilendirme İlkesi Yapılandırma

  • İlgili Öğeler

Hedefler

  • Yetkilendirme mantığını uygulamadan dışlaştırın.

  • Rollerin ötesinde yetkilendirme denetimlerini uygulayarak yetkilendirme üzerinde daha ayrıntılı bir denetim elde edin.

  • İlke temelli, bildirim temelli yetkilendirme yönetimi sağlayın.

Genel Bakış

Talep yetkilendirmesi, bir belirteç içinde taşınan bilgilerin (talepler) kullanılmasına dayanır. Talep yetkilendirmesi, yetkilendirme kararını yalnızca rollere göre vermek için yeterli olmadığında yararlıdır. Örneğin, finansal uygulamalarda aynı rol, kullanım süresine ve diğer özniteliklere göre hesaplar arasında para aktarımı için farklı sınırlara verilebilir. Bu tür öznitelikler rolle birlikte bir talep biçiminde gelebilir ve bu nedenle daha hassas bir yetkilendirme kararına izin verebilir.

Adımların Özeti

  • 1. Adım – Talep Yetkilendirme Kitaplığı Uygulama

  • 2. Adım : Talep Yetkilendirme Kitaplığını Kullanmak için bir ASP.NET Uygulaması Yapılandırma

  • 3. Adım – Yetkilendirme İlkesi Yapılandırma

1. Adım – Talep Yetkilendirme Kitaplığı Uygulama

Bu adım, bir yapılandırma dosyasından erişim ilkesi okuyacak ve erişim denetimlerini zorunlu kılacak bir dış sınıf kitaplığı oluşturmayı gösterir. Aşağıdaki örnekte, posta kodu talebine göre yetkilendirme kararı veren bir talep yetkilendirme kitaplığının nasıl uygulandığı gösterilmektedir.

Talep yetkilendirme kitaplığını uygulamak için

  1. yönetici modunda Visual Studio ® çalıştırdığınızdan emin olun.

  2. Çözüm Gezgini'da istenen çözüme sağ tıklayın, yeni bir Sınıf Kitaplığı projesi ekleyin ve sonra buna myClaimsAuthorizationManager gibi bir ad verin.

  3. Varsayılan Sınıf1.cs sınıfını silin.

  4. Yeni bir sınıf ekleyin ve bir ad verin; örneğin, ZipClaimsAuthorizationManager. Bu, posta kodlarını temel alan bir yetkilendirme uygular.

  5. Microsoft.IdentityModel'e ve System.Web derlemelerine bir başvuru ekleyin.

  6. Aşağıdaki bildirimleri ekleyin.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. ClaimsAuthorizationManager sınıfını genişletin, AccessCheck yöntemini geçersiz kılın ve ardından ZipClaimsAuthorizationManager sınıfınıza bir oluşturucu uygulayın. Kodunuz aşağıdakine benzer görünmelidir.

    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. Derleme hatası olmadığından emin olmak için çözümü derleyin.

  9. Derlenmiş kitaplığı bulun, bu örnekte MyClaimsAuthorizationManager.dll. ASP.NET web uygulamasının bin klasörüne bırakılması gerekir.

2. Adım : Talep Yetkilendirme Kitaplığını Kullanmak için bir ASP.NET Uygulaması Yapılandırma

Sonraki adımlar ASP.NET web uygulamanızda gerçekleştirilir. Önceki adımda oluşturduğunuz Talep Yetkilendirme Yöneticisi kitaplığınıza başvuru eklemeyin. ASP.NET web uygulamanız, web.config dışında bu uygulamadan "habersiz" olmalıdır.

Bir ASAP.NET uygulamasını Talep Yetkilendirme Kitaplığı'nı kullanacak şekilde yapılandırmak için

  1. ASP.NET web uygulamanızı, web.config HttpModules bölümüne aşağıdaki girdiyi ekleyerek (Visual Studio ile birlikte gelen geliştirme web sunucusu için geçerlidir; Internet Information Services için wifs ClaimsAuthorizationModule'u işlem hattına dahil etmek üzere yapılandırın (IIS) sürüm 7, bu yapılandırma system.webServer düğümü altındaki modüller bölümünde bulunmalıdır).

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. ASP.NET web uygulamanızı, microsoft.identityModel.service düğümüne aşağıdaki girdiyi ekleyerek önceki adımda uyguladığınız özel yetkilendirme kitaplığını kullanacak şekilde yapılandırın.

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

3. Adım – Yetkilendirme İlkesi Yapılandırma

Bu konuda yapılandırma ilkesi ASP.NET web uygulaması web.config dosyasında ifade edilir. İlke, kaynakları talep türüne ve değerine eşleyen basit kurallar taşır. Örneğin, aşağıdaki ilke önceki adımlarda oluşturup yapılandırdığınız özel yetkilendirme kitaplığı tarafından okunabilir ve zorunlu kılınabilir. Önceki adımda yapılandırdığınız claimsAuthorizationManager düğümüne aşağıdaki girdiyi ekleyin.

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

Yukarıdaki ilke, default.aspx sayfasına erişmek için gelen belirtecin 11111 değerine sahip bir zip talebine sahip olmasını gerektirir.