2014-09-23 14 views
7

Bir ASP.Net MVC web sitesinde kaygıların ayrılmasını sağlarken, kayıt düzeyinde yetkilendirmeyi uygulamak için iyi bir yöntem hakkında herhangi bir öneri olan var mı?MVC/ASP.Net Kayıt Düzeyinde Yetkilendirmeye İlişkin En İyi Uygulama

PrincipalPermission(SecurityAction.Demand, Role = "GroupLeader") 

o sayfaya herhangi bir ziyaretçi sabit rolü "Groupleader" üyesi olmasını gerektirecek bir: PrincipalPermission ile

, sen bir yöntem dekore edebilirsiniz. bu sayfaya herhangi bir ziyaretçi jenerik bir grup yönetmek için izin verilmesini gerektirecek

[ClaimsPrincipalPermission(SecurityAction.Demand, Operation = "Manage", Resource = "Group")] 

:

Alternatif olarak, bir yöntem dekore olabilir. Ancak, bunların hiçbiri, bir kullanıcının bazı grupları düzenleme iznine sahip olduğu ancak başkalarını düzenleme iznine sahip olamayacak senaryolara hitap etmemiştir. Anlatabildiğim kadarıyla, özel bir ClaimsAuthorizationManager uygulasaysam bile, koşullu yetkilendirmeyi yapmak için yöntem parametrelerine erişmenin bir yolu yoktur. Ayrıca, yukarıdaki yöntemlerden her ikisi de, kullanıcının, ne olduğunu açıklayan ve gerekli yetkileri almak için neler yapabileceklerini açıklayan bir sayfaya yönlendirmek için bir yönteme izin vermek yerine, kullanıcının erişimi yoksa, SecurityException kodunu attı .

Açıkçası, yetkilendirme mantığını yalnızca yönteme göre kodlayabildiğimi ve buna göre yeniden yönlendirebileceğimin farkındayım, ancak mümkünse bunu ayırmayı tercih ediyorum ve yöntem kodunu yalnızca isteği işlemek için işlemek için temiz tutmayı tercih ediyorum. Daha genel olarak uygulanabilecek bir çerçeve içinde çalışabilmek.

Yani, bu senaryoyu işlemek için bir "kullanıma hazır" yöntem var mı, yoksa özel bir IAuthorizationFilter mu uygulamalıyım? Hem kayıt düzeyinde yetkilendirmeyi hem de zarif yönlendirmeyi başarabileceğimi düşünüyorum, ancak yöntem düzeyinde herhangi bir parametre olmadan, büyük bir if ... else if ifadesi olurdu.

+0

Kutunun dışında hiçbir şey yok, ancak bir devasa "eğer başka bir şey yapmanıza gerek yok". Yetkilendirme filtresinde isteğin kendisi var, böylece oradan bir şeyler alabilirsiniz. – Shoe

+0

Gerçekten sorduğunuz soru "İşlemi _this_ nesnesinde yapabilir miyim?" Aslında şu anda bu ile ilgili arama yapıyorum ve henüz iyi bir çözüme rastlamadım. Temel olarak, [İsteğe Bağlı Erişim Denetimleri] (http://en.wikipedia.org/wiki/Discretionary_access_control). Wikipedia bunu açıklıyor, ama henüz bunun için somut bir programlama modeli bulamadım."İsteğe Bağlı Erişim Denetimi" yanıt gibi görünüyor, ancak daha fazla araştırmaya ihtiyacım var çünkü öncelikle sistem kaynaklarına (ör. Bir dosya sistemi veya bilgisayara) odaklanıyor. –

cevap

1

Bu durumun üstesinden gelmenin en yalın yolu, varlığınızın "sahibi" veya "yaratıcısı" nı depolamak için varlıklarınız üzerinde bir özellik oluşturmaktır. Daha sonra, nesneleri sorguladığınızda, buna göre filtreleme yaparsınız.

public class Foo 
{ 
    public int Id { get; set; } 

    ... 

    public string Creator { get; set; } 
} 

Ardından: Örneğin:

public ActionResult FooDetails(int id) 
{ 
    var foo = db.Foos.SingleOrDefault(m => m.Id == id && m.Creator == User.Identity.Name); 
    if (foo == null) 
    { 
     return new HttpNotFoundResult(); 
    } 

    return View(foo); 
} 

Bu kullanıcının izinlerini belirlemek için satırı seçmek zorunda çünkü bir yetkilendirme filtre yoluyla bu işlemek için gerçekten uygun değildir. Ardından, görünüme göndermek için eylemin içinde satırı tekrar seçmelisiniz. Ayrıca, filtrenin nereden geleceğini nasıl seçeceğini bilmesi için bazı akrobasi yapmak zorunda kaldınız. Böylece, ilk etapta izinleri bile kontrol edebilirsiniz. Eylemde, zaten varlık seçiyorsunuz, bu yüzden kullanıcının aynı anda "sahibi" olmasına bağlı olarak durumu düzeltin.

İlgili konular