2012-07-15 10 views
20

तो मैं मेरी लड़ाई विधिनिम्नलिखित मामले के लिए कस्टम प्राधिकरण विशेषता को कैसे कार्यान्वित करें?

[Authorize(Roles="Admin")] 
public ActionResult EditPosts(int id) 
{ 
    return View(); 
} 

मेरे मामले में मैं प्रशासकों को अधिकृत करने का है ताकि वे पोस्ट को संपादित लेकिन (यहाँ शांत हिस्सा आता है) कर सकते हैं की जरूरत है, मैं भी उस पोस्ट के निर्माता सक्षम होने के लिए अनुमति देने के लिए की जरूरत है पोस्ट संपादित करने के लिए एक सामान्य उपयोगकर्ता है। तो मैं उस उपयोगकर्ता को कैसे फ़िल्टर कर सकता हूं जिसने पोस्ट और साथ ही व्यवस्थापक भी बनाए हैं लेकिन दूसरों को अनधिकृत छोड़ दें? मैं PostEntry आईडी को रूट पैरामीटर के रूप में प्राप्त कर रहा हूं लेकिन एट्रिब्यूट के बाद और विशेषताएँ केवल स्थिर मानकों को स्वीकार करती हैं, कुछ बहुत मुश्किल लगती है, आपके उत्तरों की अत्यधिक सराहना की जाती है, चीयर्स!

+1

जब से तुम पोस्ट बनाने वाला जब तक आप इसे देख पता नहीं हो सकता। वस्तु को हाइड्रेट करने के बाद इस तर्क को शामिल करना बेहतर हो सकता है। अन्यथा, यदि आप इसे एक पहलू के रूप में लागू करते हैं, तो आपको दो बार पोस्ट देखना होगा (एक बार प्राधिकरण के लिए और एक बार संपादन के लिए)। –

+0

एक बिंदु अच्छी तरह से रखा गया है, वास्तव में मैं एक बार देखता हूं कि उसकी आईडी भूमिका प्रविष्टि पर है और फिर मेरे नियंत्रक तर्क करने के लिए है। किसी भी विचार डेटाबेस को सिर्फ एक बार कैसे मारा जाए? – Freeman

+0

इस बारे में सोचकर, यदि आप एक अच्छा ओआरएम का उपयोग कर रहे हैं, और प्राधिकरण कॉल (उस भाग के बारे में निश्चित नहीं) से पहले अपना संदर्भ सेट अप करते हैं, तो इसे पहले स्तर के कैश में कैश करना चाहिए। फिर, आपको दूसरे हाइड्रेट पर एक हिट के रूप में नहीं देखना चाहिए। –

उत्तर

42

आप एक कस्टम अधिकृत विशेषता लिख ​​सकते हैं:

public class AuthorizeAdminOrOwnerOfPostAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var authorized = base.AuthorizeCore(httpContext); 
     if (!authorized) 
     { 
      // The user is not authenticated 
      return false; 
     } 

     var user = httpContext.User; 
     if (user.IsInRole("Admin")) 
     { 
      // Administrator => let him in 
      return true; 
     } 

     var rd = httpContext.Request.RequestContext.RouteData; 
     var id = rd.Values["id"] as string; 
     if (string.IsNullOrEmpty(id)) 
     { 
      // No id was specified => we do not allow access 
      return false; 
     } 

     return IsOwnerOfPost(user.Identity.Name, id); 
    } 

    private bool IsOwnerOfPost(string username, string postId) 
    { 
     // TODO: you know what to do here 
     throw new NotImplementedException(); 
    } 
} 

और फिर इसे के साथ अपने नियंत्रक कार्रवाई को सजाने:

[AuthorizeAdminOrOwnerOfPost] 
public ActionResult EditPosts(int id) 
{ 
    return View(); 
} 
+0

धन्यवाद !!! यह वही है जो मुझे चाहिए !!! – TamarG

+0

क्यों _ // अब आईडी निर्दिष्ट किया गया था => हम access_ की अनुमति नहीं देते हैं? –

+0

** अब मैं देखता हूं ** आपको बदलने की जरूरत है: _ // अब आईडी निर्दिष्ट किया गया था ** ** ** ** निर्दिष्ट किया गया था .... (ऐसा लगता है कि अगर आईडी है तो हम एक्सेस की अनुमति नहीं देते हैं) –

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