2009-04-14 11 views
77

में प्राधिकरण विशेषता को ओवरराइड करें मेरे पास एक एमवीसी नियंत्रक बेस क्लास है जिस पर मैंने प्राधिकरण विशेषता लागू की है क्योंकि मैं लगभग सभी नियंत्रकों (और उनके कार्यों को) अधिकृत करने के लिए चाहता हूं।एएसपी.नेट एमवीसी

हालांकि मुझे नियंत्रक और अन्य नियंत्रक की कार्रवाई अनधिकृत करने की आवश्यकता है। मैं उन्हें [Authorize(false)] या कुछ के साथ सजाने में सक्षम होना चाहता था लेकिन यह उपलब्ध नहीं है।

कोई विचार?

उत्तर

70

ऐसा लगता है ASP.NET MVC 4 एक AllowAnonymous विशेषता जोड़कर इस 'स्थिर'।

David Hayden wrote about this:

[Authorize] 
public class AccountController : Controller 
{ 
    [AllowAnonymous] 
    public ActionResult Login() 
    { 
     // ... 
    } 

    // ... 
} 
96

संपादित करें: चूंकि एएसपी.नेट एमवीसी 4 सबसे अच्छा तरीका अंतर्निहित AllowAnonymous विशेषता का उपयोग करने के लिए है।

नीचे जवाब ASP.NET MVC के पुराने संस्करणों

आप प्राधिकरण या आवश्यकता नहीं है तय करने के लिए एक कस्टम प्राधिकरण विशेषता एक वैकल्पिक bool पैरामीटर के साथ मानक AuthorizeAttribute से इनहेरिट बना सकते हैं को दर्शाता है।

public class OptionalAuthorizeAttribute : AuthorizeAttribute 
{ 
    private readonly bool _authorize; 

    public OptionalAuthorizeAttribute() 
    { 
     _authorize = true; 
    } 

    public OptionalAuthorizeAttribute(bool authorize) 
    { 
     _authorize = authorize; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if(!_authorize) 
      return true; 

        return base.AuthorizeCore(httpContext); 
    } 
} 

तो फिर तुम उस विशेषता के साथ अपने आधार नियंत्रक को सजाने कर सकते हैं:

[OptionalAuthorize] 
public class ControllerBase : Controller 
{ 
} 

और किसी भी नियंत्रक आप प्राधिकरण बस एक 'गलत' के साथ ओवरराइड का उपयोग नहीं करना चाहते हैं के लिए - जैसे

[OptionalAuthorize(false)] 
public class TestController : ControllerBase 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
+0

मैं इस के बारे में सोचा है, लेकिन मैं एक सरल समाधान के लिए उम्मीद की गई थी। हालांकि अगर "वे" एक प्रदान नहीं करते हैं तो आपका समाधान सबसे अच्छा है। –

+2

'[AllowAnonymous] 'विशेषता का उपयोग करना बेहतर है। – Jaider

+0

रुको ... तो नियंत्रक केवल किसी विशेष प्रकार के शीर्ष-स्तरीय वर्ग की विशेषता का सम्मान करता है? – Triynko

15

मेरा व्यक्तिगत लेना नियंत्रक को विभाजित करना होगा। केवल उन क्रियाओं के लिए एक और नियंत्रक बनाएं जिन्हें आपको प्रमाणीकरण की आवश्यकता नहीं है।

या आप हो सकता है:

  • BaseController
    प्रमाणीकरण की आवश्यकता नहीं है - यहाँ आप अपने सभी "आधार सामान" है :)।

  • BaseAuthController : BaseController
    यहां सभी कार्यों को प्रमाणीकरण की आवश्यकता है।

इस तरह आप एक विशिष्ट वर्ग से प्राप्त करके, जब चाहें प्रमाणीकरण प्राप्त कर सकते हैं।

6

आप बस एक कार्रवाई एक अन्यथा अधिकृत नियंत्रक पर अनधिकृत होना चाहते हैं आप कुछ इस तरह कर सकते हैं:

public class RequiresAuthorizationAttribute : ActionFilterAttribute 
{ 
    private readonly bool _authorize; 

    public RequiresAuthorizationAttribute() 
    { 
     _authorize = true; 
    } 

    public RequiresAuthorizationAttribute(bool authorize) 
    { 
     _authorize = authorize; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var overridingAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof (RequiresAuthorizationAttribute), false); 

     if (overridingAttributes.Length > 0 && overridingAttributes[0] as RequiresAuthorizationAttribute != null && !((RequiresAuthorizationAttribute)overridingAttributes[0])._authorize) 
      return; 

     if (_authorize) 
     { 
      //redirect if not authenticated 
      if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
      { 
       //use the current url for the redirect 
       var redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath; 

       //send them off to the login page 
       //var redirectUrl = string.Format("?RedirectUrl={0}", redirectOnSuccess); 
       var loginUrl = LinkBuilder.BuildUrlFromExpression<HomeController>(filterContext.RequestContext, RouteTable.Routes, 
                        x => x.Login(redirectOnSuccess)); 
       filterContext.HttpContext.Response.Redirect(loginUrl, true); 
      } 
     } 
    } 
} 
संबंधित मुद्दे