2009-09-04 15 views
6

प्राधिकृत फ़िल्टर आपको उन उपयोगकर्ताओं के समूह को निर्दिष्ट करने की अनुमति देता है जो नियंत्रक या क्रिया का उपयोग कर सकते हैं:एएसपी.नेट एमवीसी: [प्राधिकरण] के विपरीत

[Authorize(Roles="Administrator")] 
public class HomeController : Controller 
{ 
    // code 
} 

मैं जानना चाहता हूं कि यह संभव है कि, यह संभव है कि उपयोगकर्ताओं के समूह को निर्दिष्ट करें कि को एक्सेस नहीं कर सकता नियंत्रक या कार्रवाई।

+1

मैं कहाँ स्विचिंग एक परिदृश्य कल्पना नहीं कर सकते एक सफेद सूची कार्यान्वयन से एक सफेद सूची कार्यान्वयन से समझ में आता है। –

+0

मैं नहीं चाहता कि मेरे प्रशासक ग्राहक से संबंधित नियंत्रकों तक पहुंच सकें, लेकिन मुझे स्पष्ट रूप से गैर-अधिकृत उपयोगकर्ताओं और ग्राहकों को सक्षम होने की आवश्यकता है। – ajbeaven

+0

ऐसे कई मामले हैं जहां यह समझ में आता है, और अधिकांश प्राधिकरण प्रणालियों में इनकार करने के लिए समर्थन शामिल है। एक परिदृश्य पर विचार करें जहां सभी उपयोगकर्ताओं को विशिष्ट भूमिका के सदस्यों को छोड़कर कुछ करने की अनुमति है। – ShadowChaser

उत्तर

5

मैं TWK के सुझाव के बाद अपने ही AuthorizationAttribute बनाने की कोशिश की:

public class Restrict : AuthorizeAttribute 
{ 
    private readonly string _role; 

    public Restrict(string role) 
    { 
     _role = role; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext == null) 
      throw new ArgumentNullException("httpContext"); 

     if (httpContext.User.IsInRole(_role)) 
      return false; 

     return true; 
    } 
} 

और मैं इस तरह इसका इस्तेमाल:

[Restrict("Administrator")] 
public class HomeController : Controller 
{ 
    // code 
} 

मैं कि क्या अनिश्चित हूँ यह सही अभ्यास है लेकिन यह नौकरी करता है।

+0

मुझे ठीक लग रहा है! :) – jeef3

+0

क्या आपकी प्रतिबंधित विशेषता एक बार में एक से अधिक भूमिका स्वीकार करती है? – twk

+0

+1 अच्छा आसान समाधान – CmdrTallen

1

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

कुछ प्रेरणा पाया जा सकता है there

1

ajbeaven's answer के आधार पर, मैंने इसे एक भूमिका के बजाय भूमिकाओं की सूची में विस्तारित करने में कामयाब रहे।

सबसे पहले प्रतिबंधित वर्ग:

public class Restrict : AuthorizeAttribute { 
    private List<string> _roles; 
    public string Roles { 
     get { 
      string roles = ""; 
      if (_roles != null && _roles.Count > 0) { 
       int counter = 0; 
       foreach (string role in _roles) { 
        counter++; 
        if (counter == _roles.Count) { 
         roles = role; 
        } else { 
         roles += role + ","; 
        } 
       } 
      } 
      return roles; 
     } 
     set { 
      _roles = new List<string>(); 
      string[] roles = value.Split(','); 
      foreach (string role in roles) { 
       _roles.Add(role); 
      } 
     } 
    } 

    public Restrict() { 
     _roles = new List<string>(); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) { 
     bool result = true; 
     if (httpContext == null) { 
      throw new ArgumentNullException("httpContext"); 
     } 
     foreach (string role in _roles) { 
      if (httpContext.User.IsInRole(role)) { 
       result = false; 
       break; 
      } 
     } 
     return result; 
    } 
} 

फिर पूरे समाधान पुन: प्रयोज्य बनाने के लिए AppRoles वर्ग जोड़ें:

public static class AppRoles { 
    public const string Role1 = "Role1"; 
    public const string Role2 = "Role2"; 
} 

उपयोग:

[Authorize] 
[Restrict(Roles = AppRoles.Role1 + "," + AppRoles.Role2)] 
    public ActionResult Index() { 
    return View(); 
} 
संबंधित मुद्दे