2012-07-15 14 views
20

yüzden, ben de yayını oluşturan yapabilmelerine izin gerekir benim Eylem MetoduAşağıdaki durum için özel Yetkilendirme özniteliği nasıl uygulanır?

[Authorize(Roles="Admin")] 
public ActionResult EditPosts(int id) 
{ 
    return View(); 
} 

Benim durumumda onlar mesajları düzenleyebilir ama (burada serin kısım geliyor) böylece yöneticiler yetki gerek var Normal bir kullanıcı olan gönderiyi düzenlemek için. Peki, postayı oluşturan kullanıcıları filtreleyenlere nasıl filtreleyebilirim, ancak diğerlerini yetkisiz bırakabilir miyim? PostEntry kimliğini bir yol parametresi olarak görüyorum ama atribute ve aynı zamanda öznitelikler sadece sabit parametreleri kabul ediyor, çok zor bir şeye benziyor, cevaplarınız çok beğeniliyor, Şerefe! onunla denetleyici eylemini süslemeleri sonra

public class AuthorizeAdminOrOwnerOfPostAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var authorized = base.AuthorizeCore(httpContext); 
     if (!authorized) 
     { 
      // The user is not authenticated 
      return false; 
     } 

     var user = httpContext.User; 
     if (user.IsInRole("Admin")) 
     { 
      // Administrator => let him in 
      return true; 
     } 

     var rd = httpContext.Request.RequestContext.RouteData; 
     var id = rd.Values["id"] as string; 
     if (string.IsNullOrEmpty(id)) 
     { 
      // No id was specified => we do not allow access 
      return false; 
     } 

     return IsOwnerOfPost(user.Identity.Name, id); 
    } 

    private bool IsOwnerOfPost(string username, string postId) 
    { 
     // TODO: you know what to do here 
     throw new NotImplementedException(); 
    } 
} 

ve:

+1

sen açın bakın yılına kadar bu görevde kimin oluşturduğu bilmiyor olabilir beri. Nesneyi nemlendirdikten sonra bu mantığı dahil etmek daha iyi olabilir. Aksi takdirde, bunu bir yön olarak uygularsanız, gönderiye iki kez bakmanız gerekebilir (bir kez yetkilendirme ve bir kez düzenleme için). –

+0

bir nokta koydum, aslında ben bir kez onun kimliği rol girişinde ve ben tekrar kontrolör mantığını yapmak için arayacaktır. Veritabanına nasıl bir kez vurulacağına dair bir fikrin var mı? – Freeman

+0

İyi bir ORM kullanıyorsanız ve içeriğinizi yetkilendirme çağrısından önce (söz konusu parça hakkında emin olmadan) ayarlarsanız bunu biraz daha düşünün, bu durumda 1. düzey önbellekte önbelleğe alınmalıdır. O zaman, ikinci hidratta bir vuruş olarak görmemelisin. –

cevap

42

Özel bir authorize özniteliği yazabilirsiniz

[AuthorizeAdminOrOwnerOfPost] 
public ActionResult EditPosts(int id) 
{ 
    return View(); 
} 
+0

Teşekkürler !!! Tam olarak ihtiyacım olan şey bu! – TamarG

+0

Neden _ // Now kimliği belirtildi => access_'a izin vermiyoruz? –

+0

** Şimdi görüyorum ** değiştirmeniz gerekir: _ // Şimdi kimliği belirlendi_ ** ** ** ** belirtildi .... (ID varsa, erişime izin vermiyoruz) –

İlgili konular