ASP.NET MVC'de rol tabanlı erişim denetimi (RBAC) ve Talep tabanlı erişim denetimi (CBAC) karşılaştırması


151

CBAC ve RBAC kullanmanın temel faydaları nelerdir ? CBAC kullanmak ne zaman daha iyidir ve RBAC kullanmak ne zaman daha iyidir?

CBAC modelinin genel kavramlarını anlamaya çalışıyorum ama genel fikir hala benim için net değil.


1
Bu kavramlar benim için hala çok belirsiz. Onlar da aynı şeyi yapıyor gibi görünüyor. Biri değeri olan roller mi?
Zapnologica

Yanıtlar:


273

Bir ASP.NET MVC Bağlamında Talep Temelli Erişim Kontrolünden nasıl yararlanabileceğinizi göstermeye çalışacağım.

Rol tabanlı kimlik doğrulamasını kullanırken, müşteri oluşturmak için bir eyleminiz varsa ve 'Satış' rolündeki kişilerin bunu yapabilmesini istiyorsanız, o zaman şu şekilde kod yazarsınız:

[Authorize(Roles="Sale")]
public ActionResult CreateCustomer()
{
    return View();
}

Daha sonra, bazen 'Pazarlama' rolündeki kişilerin Müşteri oluşturabilmesi gerektiğini fark ettiniz. Ardından, İşlem yönteminizi bu şekilde güncellersiniz

[Authorize(Roles = "Sale", "Marketing")]
public ActionResult CreateCustomer()
{
    return View();
}

Şimdi, bazı pazarlamacıların Müşteri yaratamaması gerektiğini anladınız, ancak Pazarlamada olanlara farklı bir rol atamak mümkün değil. Bu nedenle, tüm pazarlama çalışanlarının Müşteri oluşturmasına izin vermek zorundasınız.

Başka bir sorun fark ettiyseniz, Pazarlama görevlilerinin müşteri yaratmasına izin verilmesi gerektiğine her karar verdiğinizde, tüm MVC Eylem yöntemlerinizi güncellemeniz gerekir. Özniteliği yetkilendirin, uygulamanızı derleyin, test edin ve devreye alın. Birkaç gün sonra, pazarlamaya değil, ancak başka bir rolün görevi yerine getirmesine izin verilmesi gerektiğine karar verdiniz, bu nedenle kod tabanınızda arama yaparsınız ve Yetkilendir özelliğinden tüm 'Pazarlama'yı silersiniz ve Yetkilendir özniteliğine yeni rol adınızı eklersiniz ... sağlıklı çözüm. Bu noktada İzin Bazlı Erişim Kontrolüne ihtiyaç duyarsınız.

İzin Tabanlı erişim kontrolü, çeşitli kullanıcılara çeşitli izinler atamanın ve bir kullanıcının çalışma zamanında koddan bir eylem gerçekleştirme iznine sahip olup olmadığını kontrol etmenin bir yoludur. Çeşitli kullanıcılara çeşitli izinler atadıktan sonra, eğer kullanıcı "Facebook Kullanıcısı", "Uzun Süreli Kullanıcı" gibi özelliklere sahipse, bazı kullanıcıların bazı kodları yürütmesine izin vermeniz gerektiğini fark edersiniz. Bir örnek vereyim. Kullanıcı Facebook kullanarak oturum açtıysa, belirli bir sayfaya erişime izin vermek istediğinizi varsayalım. Şimdi, bu kullanıcı için bir 'Facebook' izni oluşturur musunuz? Hayır, 'Facebook' bir izin gibi gelmiyor. Yapar ? Aksine bir iddia gibi geliyor. Aynı zamanda, İzinler de Claim gibi gelebilir !! Bu nedenle, talepleri kontrol etmek ve erişime izin vermek daha iyidir.

Şimdi, talep tabanlı erişim kontrolünün somut örneğine dönelim.

Aşağıdaki gibi bazı talepler tanımlayabilirsiniz:

"CanCreateCustomer", "CanDeleteCustomer", "CanEditCustomer" .. vb.

Şimdi, Eylem Yönteminizi şu şekilde dekore edebilirsiniz:

        [ClaimAuthorize(Permission="CanCreateCustomer")]
        public ActionResult CreateCustomer()
        {
            return View();
        }

(lütfen unutmayın, [ClaimAuthorize (Permission = "CanCreateCustomer")], MVC sınıf kitaplığında yerleşik olmayabilir, ben sadece örnek olarak gösteriyorum, böyle bir Öznitelik sınıf tanımına sahip bazı sınıf kitaplığını kullanabilirsiniz)

Şimdi, CreateCustomer eylem yönteminin her zaman 'CanCreateCustomer' iznine ihtiyaç duyacağını ve asla değişmeyeceğini veya çok az değişeceğini görebilirsiniz. Dolayısıyla, veritabanınızda bir izin tablosu (talepler) ve kullanıcı-izin ilişkisi oluşturursunuz. Yönetici panelinizden, ne yapabilen her kullanıcı için izin (talep) ayarlayabilirsiniz. İstediğiniz kişiye 'CanCreateCustomer' izni (talep) atayabilirsiniz ve yalnızca izin verilen kullanıcılar müşteri oluşturabilir ve izin verilen kullanıcı yalnızca müşteri oluşturabilir ve başka hiçbir şey oluşturamaz (aynı kullanıcıya başka izinler atamadığınız sürece).

Bu güvenlik modeli size temiz kod uygulaması sunar. Dahası, Eylem Yönteminizi yazarken, bu yöntemi kimin kullanabileceğini düşünmek zorunda değilsiniz, bunun yerine bu yöntemi kullanan kişinin Yönetici tarafından verilen uygun izne (hak talebine) sahip olacağından her zaman emin olabilirsiniz. Ardından Yönetici kimin neyi yapabileceğine karar verebilir. Bir geliştirici olarak sen değilsin. İş mantığınız Güvenlik mantığından bu şekilde ayrılır.

Birisi oturum açtığında, uygulamanız o kullanıcı için mevcut olan izinleri kontrol edecek ve bu izin (talep) seti, o anda oturum açmış olan kullanıcının ek özellikleri olarak kullanılabilecektir (genellikle talep seti, oturum açmış kullanıcı için çerez olarak saklanır), böylece veritabanından her zaman izin setini kontrol etmeniz gerekmez. Sonuç olarak, rol tabanlı erişim yerine talep tabanlı erişim uygularsanız, uygulamanızda güvenlik mantığınız üzerinde daha fazla kontrole sahip olursunuz. Aslında, bir Rol de bir Talep olarak düşünülebilir.

Uygulamanız yalnızca 2 rolün olacağı çok küçük bir uygulama ise: Müşteri ve Yönetici ve Müşterinin uygulamanızda yapması gerekenden başka bir şey yapma şansı yoksa, o zaman belki Rol bazlı Erişim kontrolü amaca hizmet edecek, ancak uygulamanız büyüdükçe, bir noktada hak talebine dayalı erişim kontrolüne ihtiyaç duymaya başlayacaksınız.


12
Kafam karışan şey, Rollerin iddiaları nasıl etkilediği - iddiaya dayalı sistemlerde temelde bir talepler grubu değiller, böylece bir şeyleri toplu olarak atayabilirsiniz? Örneğin, Bob'un Pazarlama rolünde olduğunu ve Pazarlamadaki herkesin iddiaları olduğunu söyleyebilirsinizCanCreateCustomer, CanViewAdCampaigns
George Mauer

10
Vay canına, tüm bu iddiaların nasıl çalıştığını anlamaya çalışıyorum ama tüm belirsiz soyut açıklamaları ve örnekleri ASLA anlamadım. Gönderiniz aklımı açan ve mesajı ileten ilk kişiydi. Bu kadar özlü açıkladığınız için çok teşekkür ederim.
Leon Cullens

3
Bu çok düşünceli bir açıklama, ancak "Fark teknolojiden çok konseptte" yorumunuzla eksik olduğunu anladığınızı düşünüyorum. Aslında teknolojide bu cevabın ele almadığı bir fark var. Kısacası, iki teknoloji çok farklı gereksinimleri karşıladığından Rolü nasıl tanımladığınıza bağlı olduğuna katılmıyorum. Çok geniş yetkilendirme rolleri (veya iddiaları) ile ilgili tuzakları göstermede cevabın kendisi çok yardımcı olduğu için düzeltme teklif etmekten çekiniyorum. Maalesef sorulan soru bu değildi.
kenevir

7
Şöyle istediğimi varsayalım: 1) "İzin", "Müşteri oluştur" gibi basit bir işlem yapma hakkıdır. İznin adı "can" - CanCreateCustomer ile başlar. İzinlerin adları, uygulamanın kaynak kodunda kodlanmıştır. 2) Bir kullanıcıya bir dizi izin atanabilir - ancak doğrudan değil. Kullanıcı izinleri yalnızca roller aracılığıyla alır. 3) Rol, bir izinler kümesidir, başka bir şey değildir. Bazı son kullanıcılar (yöneticiler), rastgele ayarlanmış izinlerle (sabit listeden seçilir) dinamik olarak yeni özel roller oluşturabilir. Soru şudur: Talep bazlı modelde BUNU YAPABİLİR MİYİM?
Dmitry Arestov

7
Microsoft belgeleri şunları söylüyor: Bir iddia, konunun ne yapabileceğini değil, konunun ne olduğunu temsil eden ad değer çiftidir.
CodingSoft

76

Güvenlik modellerini defalarca uyguladım ve bu kavramların etrafına da sarılmak zorunda kaldım. Bunu birçok kez yaptıktan sonra, işte bu kavramları anlıyorum.

Roller Nelerdir

Rol = Kullanıcılar ve İzinlerin birleşimi .

Bir yandan, Rol, İzinler koleksiyonudur. Ben buna İzin Profili demeyi seviyorum. Bir Rolü tanımlarken, temelde bu Role bir dizi İzin eklersiniz, yani bu anlamda bir Rol bir İzin Profilidir.

Öte yandan, Rol de bir Kullanıcılar koleksiyonudur. Bob ve Alice'i Rol "Yöneticiler" e eklersem, "Yöneticiler" artık bir Grup gibi iki Kullanıcıdan oluşan bir koleksiyon içerir.

Gerçek şu ki, bir Rol HEM bir Kullanıcı koleksiyonu ve bir araya getirilmiş bir İzin koleksiyonudur. Görsel olarak bu bir Venn diyagramı olarak görülebilir.

Grup nedir

Grup = Kullanıcı Koleksiyonu

Bir "Grup" kesinlikle bir Kullanıcılar koleksiyonudur. Bir Grup ve Rol arasındaki fark, bir Rolün ayrıca bir İzin koleksiyonuna sahip olması, ancak bir Grubun yalnızca bir Kullanıcı koleksiyonuna sahip olmasıdır.

İzin nedir

İzin = Bir konu ne yapabilir

İzin Seti nedir

İzin Seti = İzinlerin Koleksiyonu

Sağlam bir RBAC sisteminde İzinler, Kullanıcılar gibi gruplandırılabilir. Gruplar yalnızca Kullanıcılardan oluşan bir koleksiyon iken, bir İzin Kümesi yalnızca İzinlerin bir koleksiyonudur. Bu, bir yöneticinin tüm İzin koleksiyonlarını tek seferde Rollere eklemesine olanak tanır.

Kullanıcılar, Gruplar, Roller ve İzinler Nasıl Bir Araya Gelir?

Güçlü bir RBAC sisteminde, Kullanıcılar, Rol içindeki Kullanıcıların koleksiyonunu oluşturmak için bir Rol'e ayrı ayrı eklenebilir veya Gruplar, Rol'e bir defada bir Kullanıcı koleksiyonu eklemek için bir Rol'e eklenebilir. Her iki durumda da Rol, Kullanıcı koleksiyonunu tek tek eklenerek veya Role Gruplar ekleyerek veya Role bir Kullanıcı ve Grup karışımı ekleyerek alır. İzinler aynı şekilde düşünülebilir.

İzinler, Rollerin içindeki İzinlerin koleksiyonunu oluşturmak için Rollere ayrı ayrı eklenebilir veya bir Role İzin Kümeleri eklenebilir. Son olarak, bir Role İzin ve İzin Kümelerinin bir karışımı eklenebilir. Her iki durumda da Rol, İzin koleksiyonunu tek tek eklenerek veya bir Rol için İzin Kümeleri ekleyerek alır.

Rollerin tüm amacı, Kullanıcıları İzinlerle birleştirmektir. Bu nedenle, Rol, Kullanıcıların ve İzinlerin BİRLİĞİ'dir.

İddialar Nelerdir

Claim = Konu "nedir"

İddialar İzin DEĞİLDİR. Önceki cevaplarda belirtildiği gibi, İddia, öznenin "öznenin" yapabildiği şey olmadığıdır ".

Talepler, Rollerin veya İzinlerin yerini almaz, bunlar bir kişinin bir Yetkilendirme kararı vermek için kullanabileceği ek bilgi parçalarıdır.

Hak Talepleri Ne Zaman Kullanılmalı

Kullanıcı bir Role eklenemediğinde veya karar Kullanıcının İzin ile ilişkilendirilmesine dayanmadığında bir Yetkilendirme kararının verilmesi gerektiğinde İddiaların yararlı olduğunu buldum. Bir Facebook Kullanıcısı örneği buna neden olur. Bir Facebook Kullanıcısı, "Rol" 'e eklenen biri olmayabilir ... onlar sadece Facebook aracılığıyla kimliği doğrulanmış bazı Ziyaretçilerdir. RBAC'a tam olarak uymasa da, bir yetkilendirme kararı vermek için bir bilgi parçasıdır.

@CodingSoft, gece kulübü metaforunu bir önceki cevapta kullandı, ben bunu genişletmek istiyorum. Bu cevapta, Sürücü Belgesi, Doğum Tarihinin Taleplerden birini temsil ettiği ve Doğum Tarihi Talebinin değerinin yetkilendirme kuralına karşı test etmek için kullanıldığı bir dizi Talep içeren bir örnek olarak kullanılmıştır. Ehliyetini veren hükümet, Talebin gerçekliğini veren makamdır. Bu nedenle, bir gece kulübü senaryosunda, kapıdaki fedai kişinin Ehliyetine bakar, sahte kimlik olup olmadığını inceleyerek güvenilir bir makam tarafından verilmiş olmasını sağlar (yani, geçerli devlet tarafından verilmiş kimlik olmalıdır), daha sonra Doğum Tarihine bakar (Ehliyetle ilgili birçok iddiadan biri), ardından bu değeri kişinin kulübe girecek kadar yaşlı olup olmadığını belirlemek için kullanır. Öyleyse,

Şimdi, bu temeli aklımda tutarak şimdi bunu daha da genişletmek istiyorum. Gece kulübünün bulunduğu binada, sadece kulüp çalışanlarının girebileceği ofisler, odalar, mutfak, diğer katlar, asansörler, bir bodrum vb. İçerdiğini varsayalım. Ayrıca, bazı çalışanların, diğer çalışanların erişemeyeceği belirli yerlere erişimi olabilir. Örneğin, bir Yönetici, diğer çalışanların erişemeyeceği bir üst kattaki bir ofis katına erişebilir. Bu durumda iki Rol vardır. Yönetici ve Çalışan.

Ziyaretçilerin kamuya açık gece kulübü alanına erişimi yukarıda açıklandığı gibi tek bir taleple yetkilendirilirken, çalışanların Rol tarafından diğer halka açık olmayan kısıtlanmış odalara erişmesi gerekir. Onlar için ehliyet yeterli değil. İhtiyaç duydukları şey, kapılara girmek için taradıkları bir Çalışan Rozeti. Bir yerlerde, Yönetici Rolünde en üst kata erişim rozetleri ve diğer odalara Çalışan Rolü erişiminde rozetler sağlayan bir RBAC sistemi vardır.

Herhangi bir nedenle belirli odaların Rol tarafından eklenmesi / kaldırılması gerekiyorsa, bu RBAC kullanılarak yapılabilir, ancak bu bir Talep için uygun değildir.

Yazılımdaki İzinler

Rolleri uygulamaya kodlamak kötü bir fikirdir. Bu donanım, Rolün amacını uygulamaya kodlar. Uygulamanın sahip olması gereken şey, Özellik İşaretleri gibi davranan İzinlerdir. Özellik Bayraklarının konfigürasyonla erişilebilir hale getirildiği yerlerde İzinler, Kullanıcının yerleştirildiği tüm Rollerden toplanan İzinlerin DISTINCT koleksiyonundan türetilen Kullanıcı Güvenlik Bağlamı tarafından erişilebilir hale getirilir. Ben buna "Etkili İzinler" diyorum. Uygulama yalnızca bir menü sunmalıdırÖzelliklere / eylemlere olası İzinler. RBAC sistemi, bu İzinleri Roller aracılığıyla Kullanıcılarla birleştirme işini yapmalıdır. Bu şekilde, Rollerin sabit kodlaması yoktur ve bir İznin değiştiği tek zaman kaldırıldığında veya yenisinin eklendiği zamandır. Yazılıma bir İzin eklendikten sonra asla değiştirilmemelidir. Yalnızca gerektiğinde kaldırılmalıdır (yani, yeni bir sürümde bir özellik sona erdiğinde) ve yalnızca yenileri eklenebilir.

Son bir not.

Verme ve Reddetme

Sağlam bir RBAC sistemi ve hatta bir CBAC sistemi Hibeler ve Redler arasında ayrım yapmalıdır.

Bir Rol için İzin eklemek, HİBE veya RED ile birlikte gelmelidir. İzinler işaretlendiğinde, VERİLEN tüm İzinler, Etkili İzinler Kullanıcılar listesine eklenmelidir. Tüm bu yapıldıktan sonra, REDDEDİLEN İzinler listesi, sistemin bu İzinleri Etkin İzinler listesinden kaldırmasına neden olmalıdır.

Bu, yöneticilerin bir konunun son İzinlerini "değiştirmesine" olanak tanır. İzinlerin doğrudan Kullanıcılara da eklenebilmesi en iyisidir. Bu şekilde, Yönetici Rolüne bir Kullanıcı ekleyebilir ve her şeye erişebilirler, ancak belki de Bayan Tuvaletine erişimi REDDETmek istersiniz çünkü Kullanıcı bir erkek. Dolayısıyla, erkek Kullanıcıyı Yönetici Rolüne eklersiniz ve Kullanıcı nesnesine DENY ile bir İzin eklersiniz, böylece yalnızca o Leydinin oda erişimini kaldırır.

Aslında, bu bir İddia için iyi bir aday olacaktır. Kullanıcının bir "cinsiyet = erkek" İddiası varsa, Yönetici Rolünde olmak tüm odalara erişim sağlar, ancak Hanımın tuvaleti ayrıca Cinsiyet = kadın Talep ve Erkekler tuvaleti Cinsiyet talep et = erkek gerektirir. Bu şekilde, tek bir yetkilendirme kuralı ile herkes için İddia yaptırımı bunu hallettiğinden, erkek Kullanıcılar için bir REDDET izni yapılandırmak zorunda kalmazsınız. Ancak her iki şekilde de yapılabilir.

Mesele şu ki, İzinlerin REDDEDİLMESİ, istisnalar uygulanabildiği için Rollerin yönetimini kolaylaştırır.

Aşağıda, RBAC modelini gösteren uzun zaman önce yaptığım bir şema var. Talepler için bir grafiğim yok, ancak bunların, nerede olurlarsa olsunlar Kullanıcılara eklenmiş nitelikler olduğunu hayal edebilirsiniz. Ayrıca, diyagram Grupları göstermiyor (bir noktada güncellemem gerekiyor).

Umarım bu yardımcı olur.

Bu, Yukarıda Anlatılan RBAC Şemasıdır

7 Nisan 2019'da güncelleme @Brent'ten gelen geri bildirimlere dayanarak (teşekkür ederim) ... önceki cevaplara yapılan gereksiz referansları kaldırdı ve bu cevabı anlaşılabilir kılmak için @CodingSoft tarafından sağlanan "gece kulübü" metaforunun orijinal temelini açıkladı. diğer cevapları okumak için.


4
Bu, en tepeye yükseltilmesi gereken harika bir açıklamadır, örnek ve diyagramı eklediğiniz için teşekkür ederiz.
Optimae

1
Mükemmel cevap. Bir öneri, diğer yanıtlara yapılan referansları kaldırmak olacaktır. Her cevap tek başına kalmalı ve diğer cevapları okumama rağmen herkes okumayacak.
Brent

Teşekkür ederim Brent. İyi fikir. Cevabı gözden geçirdim ve diğer cevaplara gereksiz referansları kaldırarak ve gece kulübü metaforunun temelini açıklayarak diğer cevabı okumaya gerek kalmaması için onu geliştirmeye çalıştım. İyileştirme için başka önerileriniz varsa, bunları hemen uygulamaktan memnuniyet duyarım. Tekrar teşekkürler.
Ricardo

1
bu harika ve harika normal bir dille açıklanıyor - teşekkür ederim
oyuncak

1
Merhaba @ SPopenko Nazik sözler için teşekkür ederim. 1) OAuth'un gibi kimlik sağlayıcıları "kimlik doğrulaması" (yani kim ispat içindir olan Konuyu "yetkilendirme" ile ilgili ise,) (yani izin ne yapmak ). Kimlik doğrulama kanıtlandıktan sonra, yetkilendirme uygulanır. 2) Bu tür izinler, yazılım yapılarına değil verilere aykırıdır. Bu iş parçacığı, düğmeler, sayfalara erişim, sekmeler vb. Gibi yeteneklerin yetkilendirilmesiyle ilgilidir. Kullanıcılar tarafından oluşturulan veriler başka bir konudur ve bu iş parçacığının kapsamı dışındadır. Bunun için yeni bir soru sormanızı tavsiye ederim. 3) Üzgünüm PoC'm yok
Ricardo

51

Emran'ın cevabına tam olarak katılmıyorum

[Authorize(Roles="Sale")]

Saf mı

Soru nasıl

  [Authorize(Roles="CustomerCreator")]

farklı

 [ClaimAuthorize(Permission="CanCreateCustomer")]

Her ikisi de eşit derecede iyiyse, neden hak talebinde bulunmamız gerekiyor?

Sanırım çünkü

Hak talepleri kavramı, Rol ile karşılaştırıldığında daha geneldir

Yukarıdaki örnek bağlamında "CustomerCreator", "Asp.NETroleProvider" tarafından sağlanan "role" türünde bir iddiadır diyebiliriz

Ek talep örnekleri.

  1. "AAA", "MYExamSite.com" tarafından sağlanan "MYExamSite.Score" türündeki hak talebidir

  2. "Altın", "MYGYMApp" tarafından sağlanan "MYGYM.Membershiptype" türü iddiadır


11
Bu cevabın, bir iddia veya rol tabanlı yetkilendirme modeli kullanılarak etkin bir şekilde uygulanabilecek bir senaryoyu tanımlamaktan ziyade, bir iddia ile eşdeğer rolü arasındaki temel farkı ele aldığı için değeri olduğunu düşünüyorum. +1
Katstevens

1
Cevabıma bir yorum gönderdim. Kuruluşunuzda "rolü" nasıl tanımladığınıza bağlı dedim. İzin / veya talep gibi görünen bir Rol tanımlayabilirsiniz. Bu yaklaşım aynı hedefe ulaşmanızı engellemez. ROLE genellikle "Randevu" anlamına gelir; terimlerin nasıl kullanıldığı budur. Aradaki fark teknolojide değil konseptte. [Authorize (Roles = "CustomerCreator")] kullanıyorsanız, soyut anlamda CBAC'ye benzer olacaktır. Tartışma, güvenlik modelinizde Randevular veya Mico İzinleri oluşturmanız gerekip gerekmediğiyle ilgilidir. İddia sadece İzinler ile ilgili değildir, daha fazlasını sunar.
Emran Hussain

MSSQL'de roller bu şekilde yapılır. DBDataReader ve DBDataWriter var MyAppDB ve HisAppDB değil.
Behrooz

Rollerin anlamı randevu nedir? RBAC'de Roller izinlerle atanır.
Wouter

48

Kabul edilen yanıt, Rolleri kör bir nesne olarak ve Talepleri esnek bir araç olarak konumlandırıyor gibi görünüyor, ancak aksi takdirde neredeyse aynı görünmelerine neden oluyor. Ne yazık ki, bu konumlandırma iddialar kavramına zarar veriyor ve temelde amaçlarının hafif bir yanlış anlaşılmasını yansıtabilir.

Roller vardır ve yalnızca örtük bir kapsam dahilinde anlam ifade eder. Genellikle bu bir uygulama veya organizasyonel kapsamdır (yani Rol = Yönetici). Öte yandan, talepler herkes tarafından 'yapılabilir'. Örneğin, Google kimlik doğrulaması, bir kullanıcının "e-postası" dahil olmak üzere hak talepleri oluşturarak bu e-postayı bir kimliğe ekleyebilir. Google hak talebinde bulunur, uygulama bu iddiayı anlayıp kabul etmemeyi seçer. Uygulamanın kendisi daha sonra "kimlik doğrulama yöntemi" (ASP.NET MVC Çekirdek Kimliği'nin yaptığı gibi) adında bir "Google" değeri içeren bir talep ekleyebilir. Her iddia, bir iddianın dışarıdan mı, yerel olarak mı yoksa her ikisini birden mi (veya gerektiğinde daha ince taneli olarak) anlamının mümkün olduğu bir kapsam içerir.

Kilit noktalar, tüm iddiaların açıkça bir kimliğe eklenmesi ve açık bir kapsam içermesidir. Bu iddialar elbette yetkilendirme için kullanılabilir - ve ASP.NET MVC, Authorize özniteliği aracılığıyla bunun için destek sağlar, ancak bu, Talepler için tek veya zorunlu olarak birincil amaç değildir. Kesinlikle onu yerel kapsamlı yetkilendirme için tamamen aynı şekillerde kullanılabilen Rollerden ayırmaz.

Dolayısıyla, yetkilendirme amacıyla Rolleri veya Talepleri veya her ikisini birden kullanmayı seçebilir ve bu Roller ve Talepler yerel olarak kapsandığı sürece her ikisine de doğal bir avantaj veya dezavantaj bulamaz. Ancak, örneğin, yetkilendirme harici kimlik taleplerine bağlıysa, Roller yetersiz olacaktır. Harici hak talebini kabul etmeniz ve bunu yerel kapsamlı bir role çevirmeniz gerekir. Bunda mutlaka yanlış bir şey yoktur, ancak bir dolaylılık katmanı sunar ve bağlamı atar.


3
Güzel cevap ... Sanırım seni anlıyorum ..., ama somut bir örnek verebilirsen daha açık olur (muhtemelen ASP MVC bağlamında) ... cevap çok soyut, kafamı sarmada zorlanıyorum etrafında.
Rosdi Kasim

2
İkinci paragraf, ASP.NET MVC Core Identity ve Google kimlik doğrulaması ile ilgili somut bir örnek içerir. Core'un yeni modelinin daha ayrıntılı bir şekilde gözden geçirilmesi yardımcı olacak gibi görünüyor - bunun için şu makaleyi tavsiye ediyorum: andrewlock.net/introduction-to-authentication-with-asp-net-core
kenevir

En iyi cevap IMHO
mrmashal

8

Daha genel olarak, öznitelik tabanlı erişim denetimini (ABAC) düşünmelisiniz. RBAC ve ABAC, Ulusal Standartlar ve Teknoloji Enstitüsü NIST tarafından tanımlanan kavramlardır. CBAC ise Microsoft tarafından geliştirilen ve ABAC'a çok benzeyen bir modeldir.

Daha fazlasını buradan okuyun:


3
Nitelik tabanlı erişim kontrolünü kullanma önerisi harika olsa da. Bunların MVC / WebAPI yığınlarında uygulanmasına yönelik ortak / en iyi uygulamalara bağlantılar güzel olurdu. Teşekkürler
Itanex

8

RBAC ve CBAC arasındaki temel şudur:

RBAC : Bir eylemi gerçekleştirmek için yetkilendirilecek bir role bir kullanıcı atanmalıdır.

CBAC : kullanıcının, yetkilendirilmesi için uygulamanın beklediği gibi doğru değere sahip bir hak talebine sahip olması gerekir. Talep tabanlı erişim kontrolünün yazılması zarif ve bakımı daha kolaydır.

Bunun yanı sıra talepler, uygulamanızın güvendiği bir yetkilendirme hizmetleri (Security Service Token STS) tarafından uygulamaya gönderilir (İtimat Eden Taraf)


6

Rol, yalnızca bir İddia türüdür. Bunun gibi birçok başka talep türü olabilir, örneğin kullanıcı adı talep türlerinden biridir


6

Hangi yöntemin en iyi olduğuna karar vermeden önce, Kimlik Doğrulamanın ne için gerekli olduğunu analiz etmek önemlidir. Kaynaktan İstem Tabanlı Yetkilendirme :

İddia, konunun yapabileceği şey değildir. Örneğin, yerel bir sürücü belgesi yetkilisi tarafından verilmiş bir sürücü belgeniz olabilir. Sürücü belgenizin üzerinde doğum tarihiniz var. Bu durumda hak talebinin adı Doğum Tarihi, talep değeri doğum tarihiniz, örneğin 8 Haziran 1970 ve düzenleyen kişi sürücü belgesi yetkilisi olacaktır. Talebe dayalı yetkilendirme, en basit haliyle, bir talebin değerini kontrol eder ve bu değere dayalı bir kaynağa erişime izin verir. Örneğin, bir gece kulübüne girmek istiyorsanız, yetkilendirme süreci şu şekilde olabilir:

Kapı güvenlik görevlisi, size erişim izni vermeden önce doğum tarihi talebinizin değerini ve verene (sürücü belgesi yetkilisi) güvenip güvenmediğini değerlendirecektir.

Bu örnekten, bir gece kulübüne Talep Bazlı Yetkilendirme ile erişimin, gece kulübünde çalışan personelin ihtiyaç duyacağı Yetkilendirme türünden çıkıldığını görebiliriz, bu durumda gece kulübü personeli a Gece kulübü ziyaretçilerinin hepsinin gece kulübünde ortak bir amacı olduğu için gece kulübü ziyaretçileri için gerekli olmayan Rol Bazlı Yetkilendirme, bu durumda gece kulübü ziyaretçileri için İddialara Dayalı Yetkilendirme uygundur.

Gönderen Rol tabanlı Yetki :

Bir kimlik oluşturulduğunda, bir veya daha fazla role ait olabilir. Örneğin, Tracy Yönetici ve Kullanıcı rollerine ait olabilirken, Scott yalnızca Kullanıcı rolüne ait olabilir. Bu rollerin nasıl oluşturulduğu ve yönetildiği, yetkilendirme sürecinin destek deposuna bağlıdır. Roller, ClaimsPrincipal sınıfındaki IsInRole yöntemi aracılığıyla geliştiriciye sunulur.


2

Rolleri talep tarzında yönetmek de mümkündür.

Bir iş rolünü yansıtan yetkilendirme rolleri oluşturmak yerine, eylem rollerini yansıtan roller oluşturun, örneğin, YaratmaMüşteri, Müşteriyi Düzenle, Müşteriyi Sil. Yöntemlere gerektiği gibi açıklama ekleyin.

Özellikle rol listesi büyüdükçe, bireyleri bir dizi eylem rolüyle eşleştirmek basit bir mesele değildir. Bu nedenle, iş rollerini daha düşük bir ayrıntı düzeyinde yönetmeniz (örn. Satış, Pazarlama) ve iş Rolünü gereken eylem rolleriyle eşleştirmeniz gerekir. Yani, bir iş rolüne bir kullanıcı ekleyin ve bu, onları mevcut yetkilendirme tablosundaki gerekli (eylem) rolleriyle eşleştirir.

Hatta iş rolünü geçersiz kılabilir ve bir kişiyi doğrudan bir eylem rolüne ekleyebilirsiniz.

Halihazırda işe yarayanların üzerine inşa ettiğiniz için, mevcut Yetkilendirme sürecini geri almazsınız. Bu yaklaşımı uygulamak için yalnızca birkaç tabloya ihtiyacınız var


1

Sanırım bu soru, ileriye dönük veritabanından cevaplanabilir. Bu implantasyonla ilgili tabloların nasıl olduğunu fark ettiyseniz, aşağıdakileri bulacaksınız

  1. AspNetUsers: her kullanıcının e-posta, adres telefonu, parola gibi tüm kullanıcılar için gerekli olan tüm özelliklere sahip bir satırı vardır ...
  2. AspNetRoles; GM, CTO, HRM, ADMIN, EMP gibi uygulama gereksinimlerine göre farklı roller tanımlar. her bir rolün tanımladığı şey, uygulama ihtiyaçlarına göre belirlenir.
  3. AspNetUserRoles: her satır, AspNetUsers ve AspNetRoles'i birbirine bağlar ve bir kullanıcı ile birçok rol arasında etkili bir şekilde bağlantı kurar.
  4. AspNetUserClaims: her satırın AspNetUsers anahtarı ve bir türü ve değeri vardır. her kullanıcı için çalışma zamanında eklenebilecek / kaldırılabilecek bir öznitelik çok etkili bir şekilde ekleyin.

Bu tabloların kullanımı, belirli ihtiyaçlara uyması için kullanıcı / uygulama yaşam süresinin bir anında değiştirilebilir.

"Satın Alma Yöneticisi" nin (PM) erken aşamasını düşünün, üç yaklaşımımız olabilir

  1. Uygulama, satın alma 'PM' hakkı vermek için AspNetUserRoles'i bir satırla doldurur. Herhangi bir tutarda satınalma siparişi vermek için kullanıcının sadece "PM" rolüne ihtiyacı vardır.

  2. Uygulama, satın alma için 'PM' hakkı vermek için AspNetUserRoles'i bir satırla doldurur ve AspNetUserClaims, miktar sınırını ayarlamak için TÜR 'Satın Alma Tutarı' türü ve "<1000" değeri talebini doldurur. Satın alma siparişi vermek için, kullanıcının 'PM' olması gerekir ve sipariş miktarı, talep TÜRÜ 'Satın Alma Tutarı'nın talep değerinden az olmalıdır.

  3. Uygulama, AspNetUserClaims'ı TYPE 'Satın Alma Tutarı' türü ve "<1000" değeriyle doldurur. Tutarın bu kullanıcı için talep TÜRÜ "Satın Alma Tutarı" nın talep değerinden az olması koşuluyla, herhangi bir kullanıcı satın alma emri verebilir.

Görülebileceği gibi, rol tabanlı, uygulama kullanıcısının hayatını sistem yönetimi açısından basitleştirecek olan katı haklardan ibarettir. ancak iş gereksinimleri açısından kullanıcı yeteneklerini sınırlayacaktır. Öte yandan, hak talebine dayalı, her kullanıcıya verilmesi gereken çok ince haklardır. İddiaya dayalı, işi de sınırları zorlayacak, ancak sistem yönetimini çok karmaşık hale getirecektir.


1

Gerçek hayattan bir örnek istiyorsanız;

Bir okul sisteminiz var ve öğretmenler oturum açabilir ve öğrencilerini görebilir. Bu öğretmenler " Öğretmen " rolü altındadır . Ancak tüm öğretmenlerin tüm öğrencileri görmesini istemiyoruz, bu yüzden aynı seviyedeki insanları iddialarıyla ayırt etmemiz gerekiyor.

  1. Mary - Matematik Öğretmeni (iddialar: matematik) -> yalnızca matematik öğrencilerini görebilir
  2. John - Fizik Öğretmeni (iddialar: fizik) -> yalnızca fizik öğrencilerini görebilir
  3. Adam - Fizik ve Kimya Öğretmeni (iddialar: fizik, kimya) -> fizik ve kimya öğrencilerini görebilir.

Bu üç öğretmenin tamamı Öğretmen rolü altındayken , öğrencileri yalnızca karşılık gelen iddialarıyla görebilirler .

Ve adı Mike olan bir müdür var:

  1. Mike - Müdür (rol: Yönetici, iddia: yok) -> herhangi bir hak talebinde bulunmasa da yönetici rolü altında olduğu için tüm öğrencileri görebilir ve yönetebilir .

Yönetici seviyesindeki kişileri ayırt etmemiz gerekirse, her birine ilgili talepler atayabiliriz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.