2011-01-12 14 views
5

में प्राधिकृत विशेषताएँ उन भूमिकाओं में कुछ है जो मुझे बिल्कुल नहीं मिलती हैं। [Authorize] विशेषताएमवीसी ऑर्डर, प्राथमिकता और फ़ंक्शन प्रश्न

का उपयोग कर आप नियंत्रक पर और कार्रवाई पर [Authorize] विशेषता है जब:

  1. ऐसी भूमिका दोनों में है, इस भूमिका पहुँच
  2. ऐसी भूमिका केवल है होगा , पहुँच नहीं कार्रवाई, पहुँच नहीं
  3. ऐसी भूमिका केवल कार्रवाई में परिभाषित किया गया है, लेकिन नियंत्रक पर नहीं पर नियंत्रक में परिभाषित किया है, लेकिन नहीं

मुझे लगता है कि यह तार्किक है। कार्रवाई करने से पहले आपको नियंत्रक तक पहुंच की आवश्यकता है।

क्या मैं मिल न यही कारण है कि यह does not काम:

[Authorize(Roles = "Algemeen Beheer, Admin, Coordinator, Secretariaat")] 
public class FacturatieGegevensController : Controller { 

    [Authorize(Users = "Stefan.coordinator", Roles = "Algemeen Beheer, Admin")] 
    public ActionResult Create(int instID) { 

     return View(); 
    } 

} 

जब मैं उपयोगकर्ता Stefan.coordinator जो भूमिका coordinator है रूप में लॉग इन कर रहा हूँ, मैं कर सकते हैं पहुँच नियंत्रक, लेकिन मैं उपयोग नहीं कर सकते बनाएं कार्रवाई। मैंने सोचा कि यह Users और Roles के बीच एक या संबंध होगा। क्या ऐसा नहीं है? और मैं इसे काम करने के लिए कैसे प्राप्त करूं?

उत्तर

7

पद्धति बनाएं तक पहुँचने के लिए शर्त है:

((में {Algemeen Beheer, व्यवस्थापक, समन्वयक, Secretariaat}) भूमिका) [से नियंत्रक स्तरीय] और ((USER में {Stefan.coordinator}) और ({Algemeen Beheer, व्यवस्थापक})) में भूमिका [से विधि-स्तरीय]

एक बार सभी ands/अन्य रैंकों बाहर काम कर रहा है, यह बस में जो परिणाम:

{Stefan.coordinator} में उपयोगकर्ता और भूमिका में {Algemeen Beheer, व्यवस्थापक}

है यही कारण है, एक विशेष AuthorizeAttribute भीतर, उपयोगकर्ता और भूमिकाओं को एक साथ anded कर रहे हैं। और कई AuthorizeAttributes में, शर्तों को एक साथ Anded हैं।

इस बारे में सोचने का सबसे अच्छा तरीका यह है कि [अधिकृत] गुण एक-दूसरे से अवगत नहीं हैं, इसलिए प्रत्येक स्वतंत्र रूप से निष्पादित होता है। नियंत्रक-स्तर एक पहले जाता है, फिर विधि-स्तर एक जाता है। विधि तक पहुंच प्राप्त करने के लिए, आपको सभी द्वारों को पारित करने की आवश्यकता है।

संपादित करें - इस पर एक सवाल था कि तर्क ऊपर कैसे काम करता है।

करते हैं:

A = ROLE is "Algemeen Beheer" 
B = ROLE is "Admin" 
C = ROLE is "Coordinator" 
D = ROLE is "Secretariaat" 
E = USER is "Stefan.coordinator" 

के बाद नियंत्रक स्तरीय [अधिकृत] विशेषता है (ए || बी || सी || डी), विधि-स्तरीय [अधिकृत] विशेषता है (ई & & (ए || बी)), और एकाधिक [अधिकृत] गुणों को तार्किक द्वारा दर्शाया जाता है और, तर्क समाप्त होता है (ए || बी || सी || डी) & & (ई & & (ए || बी)) , जो E & & (ए || बी) को कम करता है, जिसके लिए उपयोगकर्ता को "स्टीफन.कोर्डिनेटर" नाम दिया जाना चाहिए और "अल्जीमिन बेहिर" या "एडमिन" भूमिकाओं में होना चाहिए। चूंकि उपयोगकर्ता Stefan.coordinator इन दो भूमिकाओं में से किसी एक में नहीं है, इसलिए चेक विफल हो जाता है।

अपने विशेष समस्या के लिए ..

आप के लिए [अधिकृत] अपने स्वयं के तर्क लागू करना चाहते हैं चेक, उपवर्ग AuthorizeAttribute विशेषता और AuthorizeCore विधि ओवरराइड। इस तरह आप कह सकते हैं कि (उपयोगकर्ता == "Stefan.coordinator" || base.AuthorizeCore (...)) {...}।

+0

शायद मैं आपके तर्क का पालन नहीं कर रहा हूं, '(({Stefan.coordinator} में USER) को क्यों हटाया जा रहा है? –

+0

@ नेथन - मैंने एक स्पष्टीकरण पोस्ट किया है। अगर यह आपके प्रश्न का उत्तर देता है तो कृपया मुझे बताएं! – Levi

+0

यह आपके समीकरण में एक गलती है। ऐसा लगता है (({Stefan.coordinator} में उपयोगकर्ता) ** और ** ({Algemeen Beheer, Admin} में ROLE)) [विधि-स्तर से] क्योंकि कोई अन्य उपयोगकर्ता एक्सेस नहीं कर सकता जब यह उपयोगकर्ता-टैग – Stefanvds

-3

[Authorize] नियंत्रक स्तर पर निर्दिष्ट डिफ़ॉल्ट का उपयोग किया जब कोई [Authorize] एक व्यक्ति कार्रवाई विधि के लिए निर्दिष्ट किया है।

दोनों एक साथ काम नहीं करते हैं, और केवल एक ही निष्पादित हो जाएगा।

यदि आप [Authorize] फ़िल्टर में उपयोगकर्ता और भूमिका दोनों निर्दिष्ट करते हैं, तो दोनों को विधि तक पहुंच की अनुमति देने के लिए संतुष्ट होना चाहिए।

इसलिए यह एक और नहीं है या नहीं।

+5

[पिछली टिप्पणी संपादित करना] यह गलत है। सभी [अधिकृत] गुण (दोनों नियंत्रक और विधि) निष्पादित किए जाते हैं। – Levi

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