2014-09-23 5 views
7

क्या किसी को एएसपी.NET एमवीसी वेबसाइट के भीतर चिंताओं को अलग करने के दौरान रिकॉर्ड-स्तरीय प्राधिकरण को लागू करने के लिए एक अच्छी पद्धति पर कोई सुझाव है?रिकॉर्ड-स्तर प्राधिकरण के लिए एमवीसी/एएसपी.Net सर्वश्रेष्ठ अभ्यास

PrincipalPermission साथ

, आप के साथ एक विधि को सजाने कर सकते हैं:

PrincipalPermission(SecurityAction.Demand, Role = "GroupLeader") 

की आवश्यकता होती है जो उस पृष्ठ से किसी भी आगंतुक तय भूमिका "GroupLeader" का सदस्य होना। आवश्यक है कि उस पृष्ठ पर किसी भी आगंतुक सामान्य रूप से एक समूह का प्रबंधन करने की अनुमति दी जानी

[ClaimsPrincipalPermission(SecurityAction.Demand, Operation = "Manage", Resource = "Group")] 

:

वैकल्पिक रूप से, आप के साथ एक विधि को सजाने कर सकते हैं।

हालांकि, इनमें से कोई भी वास्तव में परिदृश्य को संबोधित नहीं करता है जिसमें उपयोगकर्ता को कुछ समूहों को संपादित करने की अनुमति हो सकती है, लेकिन दूसरों को नहीं। जहां तक ​​मैं कह सकता हूं, भले ही मैं एक कस्टम ClaimsAuthorizationManager लागू करता हूं, सशर्त प्राधिकरण करने के लिए विधि पैरामीटर तक पहुंच प्राप्त करने का कोई तरीका नहीं है।

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

जाहिर है, मुझे यह भी एहसास है कि मैं केवल विधि में प्रमाणीकरण तर्क कोड कर सकता हूं और तदनुसार रीडायरेक्ट कर सकता हूं, लेकिन यदि संभव हो तो मैं इसे अलग कर दूंगा, और विधि कोड को वास्तव में अनुरोध को संसाधित करने के लिए केवल साफ रखूंगा एक ढांचे के भीतर काम करने में सक्षम होने के लिए जो अधिक सामान्य रूप से लागू किया जा सकता है।

तो, क्या इस परिदृश्य को संभालने के लिए "आउट ऑफ़ द बॉक्स" तरीका है, या क्या मुझे कस्टम IAuthorizationFilter लागू करना है? मुझे लगता है कि मैं रिकॉर्ड-स्तरीय प्रमाणीकरण और सुंदर रीडायरेक्ट दोनों को संभाल सकता हूं, लेकिन विधि स्तर पर किसी भी पैरामीटर के बिना, यह अनिवार्य रूप से एक विशाल if ... else if कथन होगा।

+0

बॉक्स से कुछ भी नहीं है, लेकिन आपको एक विशाल 'अगर नहीं' की आवश्यकता नहीं है। प्राधिकरण फ़िल्टर में आपके पास अनुरोध है, इसलिए आप वहां से सामान प्राप्त कर सकते हैं। – Shoe

+0

जो सवाल आप वास्तव में पूछ रहे हैं वह है "क्या मैं _this_ ऑब्जेक्ट पर ऑपरेशन कर सकता हूं?" मैं वास्तव में इस से संबंधित कुछ खोज कर रहा हूं, और मैं अभी तक एक अच्छे समाधान में नहीं आया हूं। असल में, आप [विवेकाधीन एक्सेस कंट्रोल] चाहते हैं (http://en.wikipedia.org/wiki/Discretionary_access_control)। विकिपीडिया इसका वर्णन करता है, लेकिन मुझे अभी तक इसके लिए एक ठोस प्रोग्रामिंग पैटर्न नहीं मिला है।"Descretionary Access Control" उत्तर की तरह लगता है, लेकिन मुझे अधिक शोध की आवश्यकता है, क्योंकि यह मुख्य रूप से सिस्टम संसाधनों (जैसे फ़ाइल सिस्टम या कंप्यूटर) पर केंद्रित है। –

उत्तर

1

इस स्थिति को संभालने का सबसे आसान आगे तरीका इकाई के "मालिक" या "निर्माता" को स्टोर करने के लिए आपकी संस्थाओं पर एक संपत्ति बना रहा है। फिर, जब आप ऑब्जेक्ट्स से पूछते हैं, तो आप इसे फ़िल्टर करते हैं।

public class Foo 
{ 
    public int Id { get; set; } 

    ... 

    public string Creator { get; set; } 
} 

तब: उदाहरण के लिए:

public ActionResult FooDetails(int id) 
{ 
    var foo = db.Foos.SingleOrDefault(m => m.Id == id && m.Creator == User.Identity.Name); 
    if (foo == null) 
    { 
     return new HttpNotFoundResult(); 
    } 

    return View(foo); 
} 

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

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