मैं एक साधारण सीएमएस बना रहा हूं जिसमें व्यवस्थापक पैनल में भूमिकाएं गतिशील रूप से सेट की गई हैं। नियंत्रक विधि को अधिकृत करने का मौजूदा तरीका, उदाहरण के लिए [Authorize(Roles="admin")]
जोड़ना, इसलिए अब पर्याप्त नहीं है। भूमिका-क्रिया संबंध डेटाबेस में संग्रहीत किया जाना चाहिए, ताकि अंतिम उपयोगकर्ता आसानी से व्यवस्थापक पैनल में दूसरों से/अनुमति दे सकें। मैं इसे कैसे कार्यान्वित कर सकता हूं?एएसपी.नेट एमवीसी - गतिशील प्राधिकरण
उत्तर
वही है जो एएसपी.NET सदस्यता/प्रोफ़ाइल सामान आपके लिए करता है। और यह प्राधिकृत विशेषता के साथ काम करता है।
यदि आप अपना खुद का रोल करना चाहते हैं तो आप एक कस्टम एक्शन फ़िल्टर बना सकते हैं जो मानक प्राधिकृत कार्रवाई फ़िल्टर के व्यवहार की नकल करता है। नीचे छद्म कोड।
public MyAuthorizeAttribute : ActionFilterAttribute
{
public string MyRole { get; set; }
public void OnActionExecuting(ControllerContext context)
{
if (!(bool)Session["userIsAuthenticated"])
{
throw new AuthenticationException("Must log in.");
}
if (!Session["userRoles"].Contains(MyRole))
{
throw new AuthenticationException("Must have role " + MyRole);
}
}
}
भूमिका - कार्रवाई संबंध डेटाबेस में संग्रहित किया जाना चाहिए
आप जब तक आप AuthorizeAttribute
उपवर्ग के लिए इतना है कि यह ऊपर लग रहा है चाहता हूँ अपनी सुरक्षा नियंत्रक विधि के भीतर जांच करने के लिए, होगा आपके लिए डेटाबेस से भूमिकाएं।
यदि आप प्राधिकरण प्रक्रिया पर नियंत्रण रखना चाहते हैं, तो आपको AuthorizeAttribute उप-वर्ग करना चाहिए और AuthorizeCore विधि को ओवरराइड करना चाहिए। फिर डिफ़ॉल्ट रूप से अपने CmsAuthorizeAttribute
के साथ बस अपने नियंत्रकों को सजाने के लिए।
public class CmsAuthorizeAttribute : AuthorizeAttribute
{
public override virtual bool AuthorizeCore(HttpContextBase httpContext)
{
IPrincipal user = httpContext.User;
IIdentity identity = user.Identity;
if (!identity.IsAuthenticated) {
return false;
}
bool isAuthorized = true;
// TODO: perform custom authorization against the CMS
return isAuthorized;
}
}
इस के नकारात्मक पक्ष यह है कि आप ctor इंजेक्शन आईओसी के लिए पहुँच नहीं होगा, ताकि आप सीधे कंटेनर से किसी भी निर्भरता अनुरोध करने के लिए होगा।
सीधे कंटेनर से निर्भरता प्राप्त करने का नकारात्मक पक्ष क्या है? मुझे अपने रोलप्रोवाइडर कार्यान्वयन के लिए यह करना पड़ा है ... – Haroon
@ हारून - डाउनसाइड डिज़ाइन में से एक है। इसे आम तौर पर आईओसी कंटेनर से अनजान रहने के लिए कोड के लिए सर्वोत्तम अभ्यास माना जाता है ताकि आप अपनी निर्भरताओं को कम कर सकें (उदाहरण के लिए, आप WP7 पर अपना कोड पुन: उपयोग करना चाहेंगे जहां प्रतिबिंब-आधारित कंटेनर आम तौर पर प्रदर्शन कारणों से बचा जाता है)। –
@ हरून - ऐसा कहकर, एमवीसी 3 विशेषता-सजाए गए गुणों के माध्यम से फ़िल्टर विशेषता इंजेक्शन का समर्थन करता है। अभी भी कंटेनर के ज्ञान की आवश्यकता है, लेकिन यह अधिक आसानी से मजाक कर दिया गया है। –
मैं उस सामान के लिए काफी नया हूं, लेकिन मैंने एक उदाहरण देखा जहां भूमिका विशेष रूप से कोड में असाइन की गई थी, और मुझे वह नहीं चाहिए। उदाहरण के लिए, कुछ क्लाइंट में "इंजीनियर" नामक उपयोगकर्ता समूह हो सकता है जिसमें विशिष्ट विशेषाधिकार होते हैं। मैं चाहता हूं कि वह कोड के किसी भी टुकड़े को छूए बिना उन्हें व्यवस्थापक पैनल से सेट अप कर सके। अभी, मैं नहीं देख सकता कि आप – xantrus
के लिए मानक प्राधिकृत विशेषता का उपयोग कैसे कर सकते हैं धन्यवाद, मैं इसे – xantrus
पर देखूंगा, ठीक है तो आपको किसी बिंदु पर अपने डेटाबेस में लुकअप जोड़ना होगा, शायद उपयोगकर्ता और नियंत्रक से मेल खाना चाहिए/डीबी में आपके पास पहुंच नियम के साथ कार्रवाई नाम। या कुछ इस तरह का। – rmac