2010-12-03 16 views
25

के साथ प्राधिकरण सक्रिय निर्देशिका के विरुद्ध एएसपी.नेट एमवीसी में उपयोगकर्ताओं और समूहों का उपयोग करके प्रमाणित करने का प्रयास कर रहा हूं।एएसपी .NET एमवीसी फॉर्म सक्रिय निर्देशिका समूहों

मैं (खाते वर्ग को छोड़कर) मेरी सभी वर्गों पर निम्न विशेषता डाल दिया है:

[Authorize (Roles="SubcontractDB Users")] 

इस समूह के तहत OU = Area-> OU = समूहों> OU = कंपनी> सीएन = पाया जाता है सक्रिय निर्देशिका में SubcontractDB। मैं यह सोचते हैं रहा हूँ मैं भी web.config जो मैं के रूप में करने का प्रयास कर चुके में स्थापना के लिए एक RoleManager जरूरत है इस प्रकार है:

<roleManager defaultProvider="ADRoleProvider"> 
    <providers> 
    <clear /> 
     <add name="ADMembershipProvider" 
      type="System.Web.Security.ActiveDirectoryMembershipProvider" 
      connectionStringName="ADConnectionString" 
      attributeMapUsername="sAMAccountName" /> 
    </providers> 
</roleManager> 

मेरे कनेक्शन स्ट्रिंग है:

<add name="ADConnectionString" 
     connectionString="LDAP://blah.com:389/DC=blah,DC=wateva,DC=com"/> 

जाहिर है मैं इसे कर रहा हूँ गलत है क्योंकि यह काम नहीं करता है। मैं बस इतना करना चाहता हूं कि उन उपयोगकर्ताओं तक पहुंच की अनुमति दें जो एडी में किसी निश्चित समूह के सदस्य हैं। बस सकता है आप:

namespace Application.Filters 
{ 
    public class AuthorizeADAttribute : AuthorizeAttribute 
    { 
     public string Groups { get; set; } 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
     if (base.AuthorizeCore(httpContext)) 
     { 
      /* Return true immediately if the authorization is not 
      locked down to any particular AD group */ 
      if (String.IsNullOrEmpty(Groups)) 
       return true; 

      // Get the AD groups 
      var groups = Groups.Split(',').ToList<string>(); 

      // Verify that the user is in the given AD group (if any) 
      var context = new PrincipalContext(ContextType.Domain, "server"); 
      var userPrincipal = UserPrincipal.FindByIdentity(context, 
               IdentityType.SamAccountName, 
               httpContext.User.Identity.Name); 

      foreach (var group in groups) 
       if (userPrincipal.IsMemberOf(context, IdentityType.Name, group)) 
        return true; 
     } 
     return false; 
     } 
    } 
} 

और फिर मैं बस का उपयोग कर सकते निम्नलिखित ऊपर नियंत्रकों या कार्यों

Using Application.Filters; 
... 
[AuthorizeAD(Groups = "groupname")] 

एनबी:

+0

है प्राधिकरण का उपयोग करते समय प्रमाण-पत्रों के लिए पूछे जाने से रोकने का कोई तरीका है? मैं इंट्रानेट साइट पर विंडोज ऑथ का उपयोग कर रहा हूं और एडी समूह द्वारा सुरक्षित करने की आवश्यकता है और उपयोगकर्ता को प्रमाण-पत्र के लिए संकेत नहीं देता हूं। – Fireworks

उत्तर

29

तो मैं अपने ही अधिकृत विशेषता को लागू करने और उस का उपयोग कर समाप्त हो गया new PrincipalContext(ContextType.Domain); का उपयोग करें हालांकि .NET 4.0 में एक बग है जो (0x80005000) त्रुटि userPrincpal.IsMemberOf(...) पर फेंकता है। विवरण के लिए here देखें। Adding an error message to the view model based on controller attribute in ASP.NET MVC

+0

मुझे यह पसंद है कि आपने यहां क्या किया है, इस तथ्य को छोड़कर कि आप किसी साधारण कुकी पर भरोसा कर रहे हैं, इस तथ्य को कैश करने के लिए कि किसी को अधिकृत किया गया है। क्या मुझे मैन्युअल रूप से authUserGroups कुकी जोड़ने और प्रारंभिक एडी चेक को बाईपास करना बंद करना है? – Tr1stan

+0

अच्छा बिंदु, हटाया कुकी अनुभाग। – link664

+0

यह करने का गलत तरीका है। एमएसडीएन पर मेरा आलेख देखें एएसपी.नेट एमवीसी msdn.microsoft.com/en-us/library/gg703322(VS.98).aspx का उपयोग करके इंट्रानेट साइट कैसे बनाएं, आपको AspNetWindowsTokenRoleProvider क्लास – RickAndMSFT

31

यह अब ASP.NET MVC 3 में इस कार्यक्षमता के लिए अपनी खुद की विशेषता लागू करने के लिए आवश्यक है:

आप को पता है विफल प्राधिकरण के आधार पर एक पृष्ठ पर रीडायरेक्ट करने के लिए कैसे करना चाहते हैं, मेरा उत्तर यहाँ की जाँच करें। AspNetWindowsTokenRoleProvider सक्रिय निर्देशिका उपयोगकर्ता और समूहों के साथ काम करता है। AuthorizeAttribute के साथ इस का उपयोग करने के लिए आप अपने web.config के लिए निम्न जोड़ने की जरूरत: तुम इतनी तरह सक्रिय निर्देशिका समूह का उल्लेख कर सकते,

<authentication mode="Windows" /> 

<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider"> 
    <providers> 
     <clear /> 
     <add 
      name="AspNetWindowsTokenRoleProvider" 
      type="System.Web.Security.WindowsTokenRoleProvider" 
      applicationName="/" /> 
    </providers> 
</roleManager> 

फिर, अपने नियंत्रक या कार्रवाई के तरीकों पर:

[Authorize(Roles = "YOURDOMAIN\\Group1, YOURDOMAIN\\Group2")] 
+3

क्या यह प्रपत्र प्रमाणीकरण का उपयोग करते समय या केवल Windows प्रमाणीकरण का उपयोग करते समय काम करता है? – link664

+2

मेरा मानना ​​है कि मेरे प्रश्न का उत्तर नहीं है: http://stackoverflow.com/questions/2610377/how-can-i-provide-an-asp-net-forms- प्रमाणीकरण-ux-while-using-active- निर्देशिका/2634718 # 2634718 – link664

+0

यह एडी समूहों के लिए नहीं, भूमिकाओं के लिए नहीं, केवल उपयोगकर्ताओं के लिए (एडी उपयोगकर्ता) केवल 'उपयोगकर्ता = "DOMAIN \\ उपयोगकर्ता नाम" काम करता है। मुझे नहीं मिलता कि क्यों 'भूमिकाएं = "DOMAIN \\ समूह" मेरे लिए बिल्कुल काम नहीं करता है। –

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