2012-09-12 9 views
10

यह पुराना लेख है, लेकिन http://msdn.microsoft.com/en-us/library/ff650308.aspx#paght000026_step3 दिखाता है कि मैं क्या करना चाहता हूं। मैंने अपनी वेब ढांचे के रूप में Nancy को अपनी सादगी और कम-समारोह दृष्टिकोण के कारण चुना है। इसलिए, मुझे Nancy का उपयोग कर सक्रिय निर्देशिका के विरुद्ध प्रमाणित करने का एक तरीका चाहिए।मैं नैन्सी में सक्रिय निर्देशिका के विरुद्ध कैसे प्रमाणीकृत कर सकता हूं?

एएसपी.नेट में, ऐसा लगता है कि आप बस अपनी web.config फ़ाइल में कुछ सेटिंग्स द्वारा डीबी-आधारित सदस्यता प्रदाता और सक्रिय निर्देशिका के बीच स्विच कर सकते हैं। मुझे विशेष रूप से इसकी आवश्यकता नहीं है, लेकिन देव और उत्पादन के बीच स्विच करने की क्षमता अद्भुत होगी।

यह कैसे किया जा सकता है?

+1

वैसे, अभी अगर यह उपलब्ध नहीं है, मैं इसे योगदान हो जाएगा .. कि किसी भी मार्गदर्शन दिशा होगी सहायक भी हो। –

+0

मैंने अभी नैन्सी रेपो में एक मुद्दा जोड़ा है: https://github.com/NancyFx/Nancy/issues/742 –

उत्तर

13

वास्तव में समाधान ऐसा लगता है उससे कहीं अधिक सरल है। बस अपने उपयोगकर्ताओं के लिए एक रजिस्ट्री के रूप में सक्रिय निर्देशिका के बारे में सोचें (बस डेटाबेस की तरह)। आपको केवल यह सत्यापित करने के लिए क्वेरी एडी है कि उपयोगकर्ता नाम और पासवर्ड मान्य हैं। इसलिए, केवल नैन्सी के फॉर्म सत्यापन का उपयोग करें और IUserMapper के कार्यान्वयन में एडी को कननेट को संभालें। यहाँ मैं अपने उपयोगकर्ता नक्शाकार के लिए के साथ आया है:

public class ActiveDirectoryUserMapper : IUserMapper, IUserLoginManager 
{ 
    static readonly Dictionary<Guid, long> LoggedInUserIds = new Dictionary<Guid, long>(); 

    readonly IAdminUserValidator _adminUserValidator; 
    readonly IAdminUserFetcher _adminUserFetcher; 
    readonly ISessionContainer _sessionContainer; 

    public ActiveDirectoryUserMapper(IAdminUserValidator adminUserValidator, IAdminUserFetcher adminUserFetcher, ISessionContainer sessionContainer) 
    { 
     _adminUserValidator = adminUserValidator; 
     _adminUserFetcher = adminUserFetcher; 
     _sessionContainer = sessionContainer; 
    } 

    public IUserIdentity GetUserFromIdentifier(Guid identifier, NancyContext context) 
    { 
     _sessionContainer.OpenSession(); 
     var adminUserId = LoggedInUserIds.First(x => x.Key == identifier).Value; 
     var adminUser = _adminUserFetcher.GetAdminUser(adminUserId); 
     return new ApiUserIdentity(adminUser); 
    } 

    public Guid Login(string username, string clearTextPassword, string domain) 
    { 
     var adminUser = _adminUserValidator.ValidateAndReturnAdminUser(username, clearTextPassword, domain); 
     var identifier = Guid.NewGuid(); 
     LoggedInUserIds.Add(identifier, adminUser.Id); 
     return identifier; 
    } 
} 

मैं अपने डेटाबेस भूमिकाओं को संभालने के लिए में एक रिकॉर्ड रखने रही है, इसलिए इस वर्ग ई के साथ की पुष्टि करने और डेटाबेस से उपयोगकर्ता प्राप्त करते समय हैंडल:

public class AdminUserValidator : IAdminUserValidator 
{ 
    readonly IActiveDirectoryUserValidator _activeDirectoryUserValidator; 
    readonly IAdminUserFetcher _adminUserFetcher; 

    public AdminUserValidator(IAdminUserFetcher adminUserFetcher, 
           IActiveDirectoryUserValidator activeDirectoryUserValidator) 
    { 
     _adminUserFetcher = adminUserFetcher; 
     _activeDirectoryUserValidator = activeDirectoryUserValidator; 
    } 

    #region IAdminUserValidator Members 

    public AdminUser ValidateAndReturnAdminUser(string username, string clearTextPassword, string domain) 
    { 
     _activeDirectoryUserValidator.Validate(username, clearTextPassword, domain); 

     return _adminUserFetcher.GetAdminUser(1);    
    } 

    #endregion 
} 

और इस वर्ग वास्तव में पुष्टि करता है कि नाम/पासवर्ड संयोजन सक्रिय निर्देशिका में मौजूद हैं:

public class ActiveDirectoryUserValidator : IActiveDirectoryUserValidator 
{ 
    public void Validate(string username, string clearTextPassword, string domain) 
    { 
     using (var principalContext = new PrincipalContext(ContextType.Domain, domain)) 
     { 
      // validate the credentials 
      bool isValid = principalContext.ValidateCredentials(username, clearTextPassword); 
      if (!isValid) 
       throw new Exception("Invalid username or password."); 
     } 

    } 
} 
+0

माइनर नाइटपिक: 'LoggedInUserIds.First (x => x.Key == पहचानकर्ता) के बजाय। Value' , क्या आप सिर्फ 'LoggedInUserIds [पहचानकर्ता]' नहीं कर सकते थे? 'लॉग इन' विधि में 'LoggedInUserIds [पहचानकर्ता] = adminUser.Id' भी। –

+0

इसे Nuget Nancy.ActiveDirectory प्रमाणीकरण पैकेज के रूप में बनाया जा सकता है? – pashute

+0

@pashute [एडी चर्चा] (https://github.com/NancyFx/Nancy/issues/742) नैन्सी के अंक ट्रैकर पर (जो इस उत्तर से वापस लिंक) – Omni

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

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