2009-08-27 21 views
10

Bir oturum değeri temelinde bir denetleyici eylemine erişim yetkisi veren yeni bir eylem filtresi ([Authorize] öğesine benzer özellik) yaptım. Ancak, temel olarak tüm denetleyici eylemleri bu öznitelikle (çok az istisna hariç) dekore ediyorum.Tüm Denetleyici İşlemlerinde (C#/ASP.NET MVC) Eylem Filtresini Yürütme

Yani, bundan böyle Eylem Filtre olması daha iyi olacağını düşündüm hep Bir kontrolör eylemine bir [ExemptFromAuthorize] özelliğini ekleyin durumlarda hariç idam? (Belki de kendi Controller sınıfımdan devralınarak mı?)

Bunu nasıl yapabilirim?

+0

Bu soru eski ve MVC4'te 'AllowAnonymous adlı yeni bir özellik var. 'bunun için özel olarak yapılmış. – Omar

cevap

6

jeef3'un yanıtıyla birlikte çalışıyorum. Birden fazla sınırlandırılmış eylem gibi daha fazla hata denetimi ve sağlamlık kullanabilir, ancak genel fikir çalışır. Özel durumunuzda, oturum değerini test edebilir ve yetkilendirmeden geri dönmeye karar verebilirsiniz.

public class AuthorizeWithExemptionsAttribute : AuthorizeAttribute 
{ 
    public string Exemption { get; set; } 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.RouteData.GetRequiredString("action") == Exemption) 
      return; 

     base.OnAuthorization(filterContext); 
    } 

} 

Kullanımı: CodeProject benim makalede dışarı

[AuthorizeWithExemptions(Roles="admin", ExemptAction="Index")] 
public class AdminController : Controller 
... 
2

Bunu ben sınıf düzeyinde özelliğinden özel bir metod dışlamak nasıl bilmiyorum o sınıfta

[Authenticate] 
public class AccountController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

tüm yöntemlere başvurmak zorunda sınıfa özelliğini ekleyebilirsiniz. Kimliği doğrulanmamış istekler için ayrı bir denetleyici kullanabilir miyim?

+0

Ayrı denetleyiciler yapmak, spagetti-kodumu değiştirir ... sınıf düzeyi özelliğinden özel yöntemler hariç, tam ihtiyacım olan şey olurdu. – Alex

3

Belki de ilk özelliğinize bir Except mülkünü ekleyip deneyebilirsiniz?

[MyAuthenticate(Exempt="View")] 
public class MyController : Controller 
{ 
    public ActionResult Edit() 
    { 
     // Protected 
    } 

    public ActionResult View() 
    { 
     // Accessible by all 
    } 
} 
+0

Eylem filtresindeki mantık nasıl çalışır? (Aslında "Muaf" çalışmasını yapmak)? – Alex

7

Kontrol - Bu yazıda

http://www.codeproject.com/KB/web-security/AuthorizeWithExemptions.aspx

, ben ASP.NET MVC güvenliğini sağlamaya yönelik bir çözüm sunmak edeceğiz Uygulama denetleyicileri, tüm eylemleri güvenli olmayan olarak tanımladığınız durumlar dışında güvenli olacak şekilde. koddan

snipper: 2013+ bu okuyan herkes için

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    ActionDescriptor action = filterContext.ActionDescriptor; 
    bool IsUnsecured = action.GetCustomAttributes(
         typeof(UnsecuredActionAttribute), true).Count() > 0; 

    //If doesn't have UnsecuredActionAttribute - then do the authorization 
    filterContext.HttpContext.SkipAuthorization = IsUnsecured; 

    base.OnAuthorization(filterContext); 
} 
+1

Bu, önereceğim şeyden çok daha fazlası. –

0

, MVC4 şimdi [AllowAnonymous]

herhangi fonksiyonları üzerine Anonim denetleyicisinde Yetkilendir'i koymak ve sonra izin ver edebilir kullanımını destekler yetki vermek istemiyorsunuz.

Örnek:

[Authorize] 
public class HomeController : Controller 
{ 

    [AllowAnonymous] 
    public ActionResult Index() 
    { 

    } 
} 
6

Eğer sadece Global içine aşağıdaki satırları ekleyin tüm eylemlere filtre uygulamak isterseniz ben .. soru zaten oldukça eski ama anlıyoruz.asax:

protected void Application_Start() 
{ 
    // your code here and then 
    RegisterGlobalFilters(GlobalFilters.Filters); 
}  

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new MyActionFilterAttribute()); 
} 

Ve motor şu şekilde diğer nitelikler varsa eylem filtresinde sadece kontrol edebilirsiniz:

public void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherActionAttribute), false)) 
    { 
     // do what you want to do 
    } 
} 
2013+ bu okuyan herkes için
+0

ActionDescriptor şu anda "IsDefined" tanımlamıyor. – hallizh

+0

Soru başlığındaki soru için buna gelen herkes için, bunun ilk kısmı, her denetleyici eyleminde bir eylem filtresinin nasıl çalıştırılacağının gerçek cevabıdır. –

1

, MVC4 şimdi kullanımını destekler [AllowAnonymous]

Yetkilendirmek istemediğiniz işlevleri üzerinde denetleyiciye Yetkilendirebilir ve ardından Anonim İzin Verebilirsiniz.

Örnek:

[yetkilendirme] genel sınıf HomeController: Denetleyici {

[AllowAnonymous] 
public ActionResult Index() 
{ 

} 

}

özel bir [MyAuthorize] filtre ile bu çalışma ya da yalnızca çalışır istiyorsunuz [Authorize]

+0

[MyAuthorize] öğenizi AuthorizeAttribute'dan türetirseniz, [AllowAnonymous] sizin için çalışacaktır. – Gh61

İlgili konular