ASP.NET MVC में ओवरराइड करें अधिकृत विशेषता


83

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

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

कोई विचार?

जवाबों:


100

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

नीचे दिए गए जवाब ASP.NET MVC के पुराने संस्करणों को संदर्भित करता है

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

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

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

2
[AllowAnonymous]विशेषता का उपयोग करना बेहतर है ।
जयद्र

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

क्या आप जानते हैं कि AllowAnonymous का उपयोग करने के लिए यह वास्तव में बेहतर क्यों है? क्योंकि आपके पास महीन नियंत्रण है। मेरे मामले में, मैं केवल कुछ परिवेशों के लिए प्राधिकरण के समापन बिंदुओं को अक्षम करने के लिए देख रहा हूं, आपको उदाहरण के लिए स्थानीयहोस्ट के लिए इसकी आवश्यकता नहीं है। यह मेरे स्टार्टअप में और क्या करता है, की तुलना में अधिक सुरुचिपूर्ण समाधान प्रदान करता है। हम 11 साल बाद यहां बात कर रहे हैं।
स्कलाज


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);
            }
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.