7

अंदर मैं एक परिदृश्य है कि मैं हल करने में सक्षम नहीं किया गया है। कार्यक्षमता का मुख्य भाग जो मैं जोड़ना चाहता हूं, उसमें बदलने की क्षमता है जहां उपयोगकर्ता को पुनर्निर्देशित किया जाता है यदि वे किसी निश्चित भूमिका में नहीं हैं। मुझे कोई फर्क नहीं पड़ता कि सिस्टम उन्हें वापस लॉगिन पृष्ठ पर भेजता है यदि वे प्रमाणीकृत नहीं हैं, लेकिन मैं यह चुनना चाहता हूं कि उन्हें कहां भेजना है यदि वे प्रमाणीकृत हैं लेकिन उस क्रिया विधि तक पहुंचने की अनुमति नहीं है।UrlHelper और ViewContext एक प्राधिकरण गुण

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
     public string Action; 
     public string Controller; 

     protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
     { 
      // if User is authenticated but not in the correct role 
      string url = Url.Action(this.Action, this.Controller);     
      httpContext.Response.Redirect(url); 
     } 
    } 

और एक अतिरिक्त बोनस के रूप में मैं इससे पहले कि मैं रीडायरेक्ट कर ViewContext और TempData के लिए उपयोग करना चाहते हैं:

यहाँ मैं करना चाहते हैं क्या है।

इस बात पर कोई विचार है कि मैं विशेषता में UrlHelper और ViewContext को तुरंत कैसे प्राप्त कर सकता हूं?

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (filterContext == null) 
    { 
     throw new ArgumentNullException("filterContext"); 
    } 

    // Call the AuthorizeCore which should return true or false 
    if (!this.AuthorizeCore(filterContext.HttpContext)) 
    { 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary() 
     { 
      { "controller", "home" }, 
      { "action", "about" }, 
      { "id", "foo" }, 
     }); 
    } 
} 

जहां तक ​​ViewData और TempData का संबंध है: filterContext.Controller.ViewData और filterContext.Controller.TempDataOnAuthorization विधि के अंदर काम करना चाहिए

उत्तर

11

आप OnAuthorization विधि रद्द कर सकते थे। और अंत में आप उपयोग करना चाहते हैं एक UrlHelper (इस मामले में कोई जरूरत नहीं है, क्योंकि RedirectToRouteResult बेहतर है वहाँ) आप इसे का दृष्टांत सकता है:

var urlHelper = new UrlHelper(filterContext.RequestContext); 
+1

शानदार, THX। आपकी प्रतिक्रिया को देखने के बाद मुझे एहसास हुआ कि मैं बस पूछ सकता था "मैं प्राधिकरण कॉन्टेक्स्ट प्राप्त करने के बारे में कैसे जा सकता हूं।" एक बार मेरे पास यह है कि मैं खतरनाक हूं। –

+0

नोट: एक ऑन-प्राधिकरण() विधि लागू करना एक मामूली व्यायाम नहीं है। यदि आप AuthorizeCore() के बजाय ऑन-प्राधिकरण() को ओवरराइड करना चुनते हैं, तो आउटपुट कैशिंग को अक्षम या हुक करने के लिए कृपया ऑन-प्राधिकरण() में कोड जोड़ें। अधिक जानकारी के लिए http://forums.asp.net/p/1533590/3737756.aspx देखें। – Levi