2011-05-07 17 views
15

मैं एक कस्टम AuthorizeAttribute कैसे बना सकता हूं जो एक स्ट्रिंग पैरामीटर के रूप में एक संदेश निर्दिष्ट करता है और फिर लॉगिन पृष्ठ के साथ पास करता है?एमवीसी 3 AuthorizeAttribute कस्टम संदेश

उदाहरण के लिए, आदर्श रूप में यह यह करने के लिए शांत होगा: लॉगिन कार्रवाई में फिर

[Authorize(Message = "Access to the blah blah function requires login. Please login or create an account")] 
public ActionResult SomeAction() 
{ 
    return View(); 
} 

,, मैं कुछ इस तरह कर सकता है:

public ActionResult Login(string message = "") 
{ 
    ViewData.Message = message; 

    return View(); 
} 

और अंत में दृश्य मैं में यह कर सकते हैं:

@if (!String.IsNullOrEmpty(ViewData.Message)) 
{ 
    <div class="message">@ViewData.Message</div> 
} 

<form> blah blah </form> 

असल में मैं लॉगिन पेज पर एक कस्टम संदेश पास करना चाहता हूं ताकि मैं प्रदर्शित कर सकूं यह संदेश विशिष्ट है कि उपयोगकर्ता उस विशेष समय पर पहुंचने का प्रयास कर रहा है।

उत्तर

23

आप कुछ इस तरह की कोशिश कर सकते हैं:

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string Message { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var result = new ViewResult(); 
     result.ViewName = "Login.cshtml";  //this can be a property you don't have to hard code it 
     result.MasterName = "_Layout.cshtml"; //this can also be a property 
     result.ViewBag.Message = this.Message; 
     filterContext.Result = result; 
    } 

उपयोग:

[CustomAuthorize(Message = "You are not authorized.")] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
+3

क्या होगा यदि मैं एक विशिष्ट देखें/नियंत्रक/रूटिंग मानकों पर पुन: निर्देशित करना चाहता था, यह कैसे हो सकता है? – ClayKaboom

+1

@ClayKaboom इस पोस्ट को देखें http://stackoverflow.com/questions/2472578/is-it-possible-to-use-redirecttoaction-inside-a-custom-authorizeattribute-clas – user1477388

+0

ध्यान दें कि आप शायद शामिल नहीं करना चाहते हैं व्यूनाम संपत्ति में ".cshtml"। जब मैंने किया, तो यह login.cshtml.cshtml की तलाश में था। – AaronSieb

3

web.config

<authentication mode="Forms"> 
     <forms name="SqlAuthCookie" 
      loginUrl="~/Account/LogOnYouHavenotRight" 
      timeout="2880"  /> 
</authentication> 

नियंत्रक:

public ActionResult LogOn() 
    { 
     return View(); 
    } 

    public ActionResult LogOnYouHavenotRight() 
    { 
     return View(); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
    } 

में दोनों दृश्य:

Html.BeginForm("LogOn", "Account") 
+0

पूरे उत्तर का केवल एक हिस्सा है, लेकिन यदि आप दूसरों को पढ़ते हैं तो आप उन्हें योग करने के लिए पर्याप्त चालाक हो सकते हैं, फिर भी +1 करें .... – ppumkin

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