2010-03-18 15 views
50

एएसपी.नेट एमवीसी 2 का उपयोग करना, कक्षा पर आधारित कक्षा के अंदर Controller कक्षा की RedirectToAction() विधि का उपयोग करने का कोई तरीका है?क्या कस्टम AuthorizeAttribute क्लास के अंदर RedirectToAction() का उपयोग करना संभव है?

public class CustomAttribute : AuthorizeAttribute { 
    protected override bool AuthorizeCore(HttpContextBase context) { 
     // Custom authentication goes here 
     return false; 
    } 

    public override void OnAuthorization(AuthorizationContext context) { 
     base.OnAuthorization(context); 

     // This would be my ideal result 
     context.Result = RedirectToAction("Action", "Controller"); 
    } 
} 

मैं एक तरह से फिर से सीधा करने के लिए उपयोगकर्ता एक विशिष्ट नियंत्रक/कार्रवाई करने के लिए जब वे प्रमाणीकरण के बजाय असफल उन्हें प्रवेश पृष्ठ पर लौटने की तलाश कर रहा हूँ। क्या उस नियंत्रक/क्रिया के लिए पुन: सीधा यूआरएल उत्पन्न करना संभव है और फिर RedirectResult() का उपयोग करें? मैं यूआरएल को कड़ी-कोड करने के लिए प्रलोभन से बचने की कोशिश कर रहा हूं।

उत्तर

94

OnAuthorization के बजाय आप HandleUnauthorizedRequest ओवरराइड कर सकते हैं। यहाँ डिफ़ॉल्ट कार्यान्वयन है:

protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) { 
     // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
     filterContext.Result = new HttpUnauthorizedResult(); 
    } 

आप Controller.RedirectToAction उपयोग नहीं कर सकते, लेकिन आप एक नई RedirectToRouteResult लौट सकते हैं।

तो तुम कर सकते हैं:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { 
     // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
     filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary 
            { 
             { "action", "ActionName" }, 
             { "controller", "ControllerName" } 
            }); 
    } 
+1

धन्यवाद, यह काम करता है। HandleUnauthorizedRequest का उपयोग करने पर अच्छा पकड़ - मैं ऑनअधिकरण का उपयोग कर रहा था क्योंकि मैंने इसे किसी अन्य ट्यूटोरियल/चर्चा में देखा था (उनके पास एक कस्टम प्रॉपर्टी थी जो प्रमाणीकरण विफल होने पर सेट किया गया था जो फिर से डायरेक्ट ट्रिगर करेगा)। –

+0

@LanceMcNearney मैं पैरामीटर फ़िल्टरकॉन्टेक्स्ट में क्या पास करूंगा? – Pomster

+0

@ क्रेग स्टंटज़ मैं फ़िल्टरकॉन्टेक्स्ट के रूप में क्या पास करूंगा? – Pomster

11

आप कुछ इस तरह कर सकते हैं:

var routeValues = new RouteValueDictionary(); 
routeValues["controller"] = "ControllerName"; 
routeValues["action"] = "ActionName"; 
//Other route values if needed. 
context.Result = new RedirectToRouteResult(routeValues); 

इस तरह ढांचे यह होता है जब आप "RedirectToAction()" अपने नियंत्रक में कहते हैं।

+0

संदर्भ क्या है? क्या मैंने इसे लाल रंग में रेखांकित किया है? – Pomster

+0

@ पोम्स्टर प्रश्न देखें, "संदर्भ" प्रश्न के बारे में विधि के लिए एक पैरामीटर है। –

+0

धन्यवाद, यह काम करने के लिए क्या किया जाएगा? Iv यह काम करने के लिए संघर्ष कर रहा है – Pomster

2

किसी और मामले किसी को भी इस सवाल में रुचि रखता है। यह एक सरल तरीका था हल किया जा सकता (MVC 3 का उपयोग कम से कम, MVC 2 के बारे में पता नहीं है):

बस अपने कस्टम AuthorizeAttribute में एक छोटे से निजी नियंत्रक बनाने के लिए:

private class RedirectController : Controller 
    { 
     public ActionResult RedirectWhereever() 
     { 
      return RedirectToAction("Action", "Controller"); 
     } 

    } 

यह आसानी से कर सकते हैं अपने हैंडल यूनाधिकृत रिवेस्ट विधि में उपयोग किया जाए (क्रेग उत्तर देखें):

filterContext.Result = (new RedirectController()).RedirectWhereever(); 
+2

'रीडायरेक्ट टॉएक्शन' एक 'रीडायरेक्ट टॉउआर रूट' रिटर्न देता है, एक कंट्रोलर बनाने के लिए सिर्फ एक को वापस करने की आवश्यकता नहीं है, क्योंकि @ क्रैग स्टंटज़ ने उत्तर दिया –

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