2010-05-20 33 views
5

modeli sınıfları kullanma izni Bu yüzden merhaba :) Tamam, ASP.NET MVC Framework ve i ilk uygulamam yazıyorum ... en sadede izin burada benim ilk yazı model sınıfları örneklerini kullanma ayrıcalıklarını denetleme ile ilgili bir sorun (okuma, düzenleme). Örnek kod şuna benzer:ASP.NET MVC yetkilendirme ve

// Controller action 

[CustomAuthorize(Roles="Editor, Admin")] 
public ActionResult Stats(int id) 
{ 
    User user = userRepository.GetUser(id); 

    if (user == null || !user.Activated || user.Removed) 
     return View("NotFound"); 
    else if (!user.IsCurrentSessionUserOwned) 
     return View("NotAuthorized"); 

    return View(user); 
} 
Şimdiye kadar yetki nitelik yüzden benim sorum, sadece denetleyici eylemleri korur

: nasıl CustomAuthorize eylem yöntemleri örneği yani kaynaklar sadece kullanıcı rolü, kullanıcı adlarını kontrol etmek özniteliği hem de yaptılar (yukarıda: kullanıcı sınıfı, ancak diğer ORM LINQ2SQL sınıflar News gibi orada vs. Resimler) bu nesnenin tamamı, kendilerine özgü kimlikleri var kontrol etmek kullanıcı varlık kendi kimliğine sahip böylece, Haber onların kimlikleri ve kullanıcı kimliği alan kullanıcılar masaya referecned var. Bu sorunu nasıl çözmeliyim? i sağ anlamak durumunda

cevap

1

, sen

Eh .. o doesnt "Yönetici" veya "Editör" rolünü sahip olsa bile, Makaleler kendi Haberler veya Makaleler düzenlemek için Haberler yazma kullanıcıyı izin vermek istiyorum o olduğu gibi sizin CustomAuthorize Let

ANCAK sadece bir action parametre ie enjekte yerine hata Görünüm falan dönüş, eylem devam edelim: ilginç bir olay, basit bir çözüm olurdu

CustomAuthorize:

012 isAuthorized rol doğrulama mantığı sonucunu tutacaktır
//..Your Role Validation Logic Here... 
    if (filterContext.ActionParameters.Keys.Contains("isAuthorize")) 
     { 
     filterContext.ActionParameters.Remove("isAuthorize"); 
     } 
    filterContext.ActionParameters.Add("isAuthorize", isAuthorized); 

.

[CustomAuthorize(Roles="Editor, Admin")] 
public ActionResult Stats(int id, bool isAuthorized) 
{ 
    User user = userRepository.GetUser(id); 

    if (user == null || !user.Activated || user.Removed) 
     return View("NotFound"); 
    else if (user.Id != CurrentUser.Id && !isAuthorized) 
      //not Authorized by roles 
      //not the owner get away from here =D 
     return View("NotAuthorized"); 

    return View(user); 
} 

Sana BaseController (abstrac sınıfı) bir özelliğinden gelen bir CurrentUser erişebilir farz ediyorum:

Yani denetleyicisi, bir 2 parametreyi eklemelisiniz. bir şey daha uygulanması

bu karmaşık duruma neden olacaktır daha özenli.

yapabilirsiniz Örneğin

, ancak önerilmez:

A. bir parametre (eğer GET veya POST Eğer kullanıcı kimlik eklemem gerekiyor talep url bir kimlik göndermek yüzden her zaman olarak sahibinin kullanıcı kimliği gönder Bir parametre olarak sahibi). Ancak bu, gerçekten çirkin güvenlik kusurlarına yol açabilir, çünkü kullanıcı ve woala tarafından kurcalanabilen tel tarafından gönderilen kullanıcı ID'sine bağlısınız! şimdi yetkiliyim. B. Nesneyi eylem filtresinde örneklemeye çalışın (ancak önce örneği çalıştığınız öğeyi ilk önce anlamanız gerekir; bu, CustomAuthorize uygulamasında uzun bir anahtar deyimine ve 3. parametreye yol açabilir, böylece hangi öğeyi bildiğinizi öğrenebilirsiniz.) DB'den almak için).