2009-09-17 14 views
12

के कार्यों पर लागू होता है, मैं कस्टम प्रमाणीकरण तर्क करने के लिए एक ActionFilterAttribute का उपयोग कर रहा हूं। विशेषता केवल व्युत्पन्न नियंत्रक कक्षा पर उपयोग की जाएगी जिसमें मेरा प्रमाणीकरण तर्क शामिल है।एक्शनफिल्टरएट्रिब्यूट - एक विशिष्ट नियंत्रक प्रकार

यहाँ मेरी नियंत्रक, अपने कस्टम नियंत्रक वर्ग से ली गई है, और एक नमूना विशेषता:

public class MyController : CustomControllerBase 
{ 

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

} 

यहाँ मेरी ActionFilterAttribute का एक उदाहरण है:

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; 
     } 
    } 
} 

महान काम करता है।

यहां प्रश्न है: क्या मैं यह पूछ सकता हूं कि यह विशेषता केवल मेरे कस्टम नियंत्रक प्रकार में क्रियाओं पर उपयोग की जा सकती है?

+1

आपकी विशेषता टूट गई है क्योंकि यह एथ्रोइज एट्रिब्यूट से प्राप्त नहीं होती है और इस प्रकार कार्रवाई को कैश किए जाने पर चलाने की गारंटी नहीं दी जाती है। कैशिंग के साथ काम करने वाले समाधानों के लिए http://blogs.teamb.com/craigstuntz/2009/09/09/38390/ देखें। –

+0

कार्रवाई परिणाम कैश क्यों किया जाएगा? –

+0

इसे कैश किया जाएगा क्योंकि किसी ने इसे कैश करने के लिए कहा था। कल्पना करें कि कोई व्यक्ति उप-प्रकार पर टूटी हुई विशेषता को ध्यान में रखते हुए, अभिभावक वर्ग पर कैश विशेषता डालता है। एएसपी.NET/MVC कैशिंग के साथ मूल रूप से असंगत नहीं है जो एक विशेषता का उपयोग करना एक बेहतर विचार है। विकल्पों के लिए उपरोक्त लिंक देखें। –

उत्तर

14

आप एक्शनफ़िल्टर को कक्षा में ही डाल सकते हैं। कक्षा में सभी कार्यों को एक्शनफिल्टर का एहसास होगा।

[CustomAuthorize] 
public class AuthorizedControllerBase : CustomControllerBase 
{ 
} 

public class OpenAccessControllerBase : CustomControllerBase 
{ 
} 

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

मैं कक्षा के भीतर एक्शनफ़िल्टर को परिभाषित करने का मार्ग जा रहा हूं (इसलिए यह अन्य वर्गों पर उपलब्ध नहीं है।) यह जानना अच्छा है कि विशेषता एक नियंत्रक में सभी ActionResults भर में परिभाषित किया जा सकता है। –

7

टिप्पणियों और मेरे सिस्टम की बाधाओं के आधार पर, मैंने एक संकर दृष्टिकोण लिया। असल में, यदि अनुरोध किसी कैश किए गए मार्ग के माध्यम से आता है या "उपयोगकर्ता" किसी भी कारण से सेट नहीं होता है, प्रमाणीकरण उचित तरीके से विफल रहता है।

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

यदि आप किसी भी "isAuthorized = false" मामले में रीडायरेक्ट कर रहे हैं, तो आप अंत में क्यों सच नहीं आते? – Alex

+0

IsAjaxRequest प्रवाह के मामले में, उपयोगकर्ता को पुनर्निर्देशित नहीं किया जाता है, इसलिए विधि को अभी भी वापस करने की आवश्यकता है। ActionFilterAttribute के बजाय AuthorizeAttribute का उपयोग करने के लिए –

+0

+1। समस्या हल करता है कि नियंत्रक कार्रवाई जिसमें CustomAuthotize विशेषता है निष्पादित किया गया है भले ही हम लॉग इन नहीं हैं जिससे अन्य समस्याएं हो सकती हैं। –

संबंधित मुद्दे