2009-09-17 28 views
12

eylemlerine uygulanır Özel kimlik doğrulama mantığı yapmak için bir ActionFilterAttribute kullanıyorum. Öznitelik, yalnızca kimlik doğrulama mantığımı içeren türetilmiş bir Denetleyici sınıfı üzerinde kullanılacaktır.ActionFilterAttribute - belirli bir denetleyici türü

İşte benim özel denetleyicisi sınıfından türetilmiş benim Kontrolör,, ve örnek bir nitelik:

public class MyController : CustomControllerBase 
{ 

    [CustomAuthorize(UserType = UserTypes.Admin)] 
    public ActionResult DoSomethingSecure() 
    { 
     return View(); 
    } 

} 

İşte benim ActionFilterAttribute bir örnek:

public class CustomAuthorizeAttribute : ActionFilterAttribute 
{ 
    public MyUserTypes UserType { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     myUser user = ((CustomControllerBase)filterContext.Controller).User; 

     if(!user.isAuthenticated) 
     { 
     filterContext.RequestContext.HttpContext.Response.StatusCode = 401; 
     } 
    } 
} 

oldukça uygundur.

İşte soru şu: Bu özniteliğin SADECE özel denetleyici türümdeki Eylemler'de kullanılmasını talep edebilir miyim?

+1

AuthroizeAttribute'dan devralmadığı için eyleminiz bozuktur ve bu nedenle eylem önbelleğe alındığında çalışması garanti edilmez. Önbelleğe alma ile çalışan çözümler için http://blogs.teamb.com/craigstuntz/2009/09/09/38390/ adresine bakın. –

+0

Neden eylem sonucu önbelleğe alınır? –

+0

Birisi önbelleğe alınmasını söylediği için önbelleğe alınabilirdi. Alt tipte bozuk özniteliği fark etmeden, bir üst sınıf özniteliğini bir üst sınıfa yerleştirdiğini düşünün. ASP.NET/MVC önbelleğe alma ile temelde uyumsuz olmayan bir öznitelik kullanmak çok daha iyi bir fikir. Seçenekler için yukarıdaki bağlantıya bakın. –

cevap

14

ActionFilter'ı sınıfın kendisine koyabilirsiniz. Sınıftaki tüm eylemler ActionFilter'ı gerçekleştirecektir.

[CustomAuthorize] 
public class AuthorizedControllerBase : CustomControllerBase 
{ 
} 

public class OpenAccessControllerBase : CustomControllerBase 
{ 
} 

public class MyRealController : AuthorizedControllerBase 
{ 
    // GET: /myrealcontroller/index 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
+0

Sadece ActionFilter'ı sınıf içinde tanımlamak için rotaya gidiyorum (bu yüzden diğer sınıflarda mevcut değildir). Bir denetleyicide TÜM ActionResults arasında tanımlanabilir. –

7

Sistemimin yorumları ve kısıtlamalarına dayanarak, karma bir yaklaşım benimsedim. Temel olarak, istek önbelleğe alınmış bir yoldan geliyorsa veya "Kullanıcı" herhangi bir nedenle ayarlanmamışsa, kimlik doğrulaması doğru şekilde başarısız olur.

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    private MyUser User { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
    //Lazy loads the user in the controller. 
    User = ((MyControllerBase)filterContext.Controller).User; 

    base.OnAuthorization(filterContext); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
    bool isAuthorized = false; 
    string retLink = httpContext.Request.Url.AbsolutePath; 

    if(User != null) 
    { 
     isAuthorized = User.IsValidated; 
    } 

    if (!isAuthorized) 
    { 
     //If the current request is coming in via an AJAX call, 
     //simply return a basic 401 status code, otherwise, 
     //redirect to the login page. 
     if (httpContext.Request.IsAjaxRequest()) 
     { 
     httpContext.Response.StatusCode = 401; 
     } 
     else 
     { 
     httpContext.Response.Redirect("/login?retlink=" + retLink); 
     } 
    } 

    return isAuthorized; 
    } 
} 
+0

Herhangi bir "isAuthorized = false" durumunda yönlendirme yapıyorsanız, neden sonunda en sonunda geri dönmüyorsunuz? – Alex

+0

IsAjaxRequest akışı durumunda, kullanıcı yönlendirilmez, dolayısıyla yöntemin yine de geri dönmesi gerekir. ActionFilterAttribute yerine AuthorizeAttribute kullanmak için –

+0

+1. CustomAuthotize özniteliğine sahip olan denetleyici eyleminin, başka bir soruna neden olabilecek şekilde oturum açmamış olsak bile yürütüldüğü sorusunu çözer. –

İlgili konular