2012-03-06 7 views
38

मेरे पास नियंत्रक पर एक प्राधिकरण विशेषता है, लेकिन मैं इसे एक क्रिया पर बंद करना चाहता हूं। मैंने अपना खुद का प्राधिकरण फ़िल्टर बनाया और भूमिका सूची में "बेनामी" जोड़ा। मेरे फ़िल्टर में मैं रोल सूची में अज्ञात दिखाई देने पर सत्य वापस आ जाता हूं।क्या एमवीसी नियंत्रक में एक क्रिया पर प्राधिकरण को अक्षम करना संभव है?

हालांकि, यह लॉगिन पृष्ठ से पहले प्रतीत नहीं होता है जैसे कि नियंत्रक प्राधिकरण किसी और चीज को पूर्व-खाली कर रहा है।

+0

'(1): 'मुझे यकीन नहीं है कि मैं आपको समझता हूं, कुछ कोड अच्छा होगा। '(2): 'आप एक्शन विधियों पर प्राधिकरण विशेषताओं को जोड़ सकते हैं। – gideon

+0

आप विशेषता का अपना संस्करण बना सकते हैं। http://stackoverflow.com/questions/746998/override-authorize-attribute-in-asp-net-mvc – Tx3

+0

जी, हर कोई आपको समझ में नहीं आता :)। मैं समझता हूं, लेकिन मैं एक समाधान चाहता था क्योंकि मेरे पास एक ही समस्या है। क्या आपको इस दौरान कुछ मिला है? –

उत्तर

69

आप [Authorize] नियंत्रक वर्ग में जोड़ सकते हैं, और उसके बाद [AllowAnonymous] को उस एकल क्रिया में जोड़ें जिसे आप अधिकृत नहीं करना चाहते हैं। उदाहरण:

[Authorize] 
public class AccountController : Controller 
{ 
    public ActionResult Profile() 
    { 
     return View(); 
    } 

    [AllowAnonymous] 
    public ActionResult Login() 
    { 
     return View(); 
    } 
} 
+1

यह केवल एमवीसी 4 और ऊपर काम करता है, लेकिन यह पूरी तरह से काम करता है – Nathan

-3

अपनी एक्शन विधि पर प्राधिकरण एट्रिब्यूट न जोड़ें जहां कभी भी आपको उदाहरण के लिए जरूरी नहीं है।

मेरे कस्टम विशेषता

public class AuthorizationFilterAttribute : AuthorizeAttribute 
{ 
     Some code... 
} 

मेरे नियंत्रक

public class UserController : BaseController, IDisposable 
{ 
     [AuthorizationFilterAttribute] 
     public ActionResult UserList() 
     { 
      //Authorize attribute will call when this action is executed 
     } 

     public ActionResult AddUser() 
     { 
      //Authorize attribute will not call when this action is executed 
     } 

} 

मुझे आशा है कि आप मेरी बात है कि मैं क्या आप कहने की कोशिश कर रहा हूँ मिल गया।

================= अपडेट किया गया उत्तर ========================== ===================== नीचे एक और विशेषता बनाएं।

public sealed class AnonymousAttribute : Attribute { } 

कृपया अपने ऑन-प्राधिकरण विधि पर कोड नीचे डालें।

public override void OnAuthorization(AuthorizationContext filterContext) { 
      bool checkForAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AnonymousAttribute), true) 
      || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AnonymousAttribute), true); 
      if (!skipAuthorization) { 
       base.OnAuthorization(filterContext); 
      } 
     } 
+0

ठीक है लेकिन इसका मतलब है कि सभी नियंत्रक कार्यों में फ़िल्टर जोड़ना। मुझे प्राधिकरण फ़िल्टर को शीर्ष पर रखने और फिर मुझे अक्षम करने की आवश्यकता को अक्षम करने का विचार पसंद है। इस तरह से अधिक मजबूत/सुरक्षित लगता है। – jaffa

+0

हाँ सही। मुझे यह बताना है, क्या यह आपके लिए काम करता है या नहीं? यदि यह है तो कृपया इसे एक उत्तर के रूप में चिह्नित करें, ताकि यह दूसरों के लिए उपयोगी हो। –

+0

यह केवल उन्हीं कार्यों पर प्राधिकरण प्राप्त करने के लिए काम करता है, लेकिन यह ओपी का सवाल नहीं था। – Kyle

3

आप विशेषता का अपना संस्करण बना सकते हैं।

एक बहुत ही समान प्रश्न है और इस स्थिति को संभालने वाली अपनी विशेषता को कार्यान्वित करने का एक बहुत अच्छा जवाब है।

Override Authorize Attribute in ASP.NET MVC

Btw

। आप अपने नियंत्रक भी बना सकते हैं जो डिफ़ॉल्ट रूप से प्राधिकरण होगा।

बेस

[Authorize] 
public abstract class SecureControllerBase : Controller 
{ 
} 

प्रयोग

public class MyController : SecureControllerBase 
{ 
} 
+0

धन्यवाद, लेकिन कहें कि मेरे पास 10 क्रिया विधियों के साथ एक नियंत्रक है जिसके पास प्राधिकरण की आवश्यकता है और केवल 1 कार्यवाही की आवश्यकता है। मेरे नियंत्रक के पास सभी कार्यों पर प्राधिकरण सक्षम है (नियंत्रक परिभाषा के शीर्ष पर प्राधिकरण फ़िल्टर होने के द्वारा), हालांकि मैं इसे एक क्रिया विधि पर बंद करना चाहता हूं। – jaffa

+0

यदि आप नियंत्रक को [वैकल्पिक प्राधिकरण] जोड़ते हैं और फिर कार्रवाई के शीर्ष पर [वैकल्पिक प्राधिकरण (झूठा)] जोड़ते हैं? क्या ये तुम्हारे लिए कारगर है? – Tx3

0

सीधे शब्दों में नियंत्रक वर्ग पर क्रियाएं आप फ़िल्टर करना चाहते करने के लिए विशेषता जोड़ सकते हैं और नहीं। सजाए गए कार्यों को नहीं, उन्हें फ़िल्टर नहीं किया जाएगा, बशर्ते नियंत्रक या उसके मूल नियंत्रकों में से एक को विशेषता नहीं मिली है।

+2

मैं नियम के अपवाद चाहता हूं, इसलिए नियंत्रक के लिए चालू करें और एक ही क्रिया के लिए बंद करें। – jaffa

1

मैंने फ़ेडरेटेड पहचान प्रदाता के रूप में एज़ूर एसीएस का उपयोग करके एक समाधान किया और स्वीकार्य उत्तर मेरे लिए काम नहीं किया। जो संघर्ष कर रहे हैं, उनके लिए मेरा समाधान सुरक्षा नियंत्रक/विचारों के लिए सुरक्षा को पूरी तरह से बाईपास करना था।

उन कार्रवाइयों के लिए एक नया नियंत्रक/दृश्य बनाएं जिन्हें आपको प्राधिकरण को बाईपास करने की आवश्यकता है।

और वेब में।कॉन्फ़िगर निम्न जोड़ें,

<location path="TheNameOfTheControllerYouWantToBypass"> 
    <system.web> 
    <authorization> 
    <allow users="*" /> 
    </authorization> 
    </system.web> 
</location> 
संबंधित मुद्दे