2017-03-31 75 views
1

我想從活動目錄獲取授權用戶登錄頁面。當用戶輸入錯誤的詳細信息時,該頁面需要顯示「無效用戶」,如果輸入正確的正確詳細信息可以進入主頁。如何使用c#從asp.net中的活動目錄獲得授權用戶?

這裏提到我的代碼。當我運行這段代碼時,即使輸入正確的登錄信息,頁面也會顯示「無效的用戶」。

protected void Button1_Click1(object sender, EventArgs e) 
     { 

      string dominName = "ldap://domain.com:121"; 
      string userName = "guest"; 
      string password = "testlogin"; 

      if (true == AuthenticateUser(dominName, userName, password)) 
      { 
       Response.Redirect("default.aspx"); 
      } 
      else 
      { 
       Response.Write("Invalid user name or Password!"); 
      } 

     } 

     public bool AuthenticateUser(string domain, string username, string password) 
     { 
      DirectoryEntry entry = new DirectoryEntry(domain, username, password); 
      try 
      { 
       DirectorySearcher search = new DirectorySearcher(entry); 
       search.Filter = "(sAMAccountName=" + username + ")"; 
       search.PropertiesToLoad.Add("cn"); 
       Response.Write(domain); 
       SearchResult result = search.FindOne(); 

       if (null == result) 
       { 
        return false; 
       } 

      } 
      catch (Exception ex) 
      { 
       return false; 
       throw new Exception("Error authenticating user." + ex.Message); 
      } 
      return true; 
     } 

找到上面的代碼我犯了一個錯誤。請提供最佳解決方案...

+0

'授權用戶'你的意思是用戶是在特定的廣告組? – Win

+0

您的應用程序是否在Intranet內部運行? – DarkSquirrel42

+0

有兩個廣告組(groupA和groupB),但我想從這些組登錄任何一個用戶。 –

回答

0

最後我從this網站得到的解決方案。上面的代碼稍作修改。現在它的作品完美無缺。

protected void Button1_Click1(object sender, EventArgs e) 
     { 

      string dominName = "ldap://domain.com"; 
      string userName = "guest"; 
      string password = "testlogin"; 

      if (true == AuthenticateUser(dominName, userName, password)) 
      { 
       Response.Redirect("default.aspx"); 
      } 
      else 
      { 
       Response.Write("Invalid user name or Password!"); 
      } 

     } 

private bool AuthenticateUser(string domain, string userName, string password) 
{ 
    bool authentic = false; 
    try 
    { 
     DirectoryEntry entry = new DirectoryEntry(domain, userName, password); 
     entry.Path = "LDAP://OU=allsuers,OU=users,DC=domain,DC=com"; 
     DirectorySearcher searcher = new DirectorySearcher(entry) 
     { 
      PageSize = int.MaxValue, 
      Filter = "(sAMAccountName=" + userName + ")" 
     }; 

     var result = searcher.FindOne(); 

     if (result == null) { 
      return true; 
     } 

    } 
    catch (DirectoryServicesCOMException) { } 
    return authentic; 
} 

謝謝大家。誰都支持這樣做。

0

您可以從PrincipalContext。如果您有特定的域名,則可能需要查看this示例代碼。

public bool ValidateCredentials(string userName, string password) 
{ 
    userName = userName.EnsureNotNull(); 
    userName = userName.Trim(); 

    password = password.EnsureNotNull(); 
    password = password.Trim(); 

    using (var context = new PrincipalContext(ContextType.Domain)) 
    { 
     return context.ValidateCredentials(userName, password); 
    } 
} 

public bool IsUserInAdGroup(string userName, string adGroupName) 
{ 
    bool result = false; 
    userName = userName.EnsureNotNull(); 
    userName = userName.Trim(); 

    using (var context = new PrincipalContext(ContextType.Domain)) 
    { 
     var user = UserPrincipal.FindByIdentity(context, userName); 
     if (user != null) 
     { 
      var group = GroupPrincipal.FindByIdentity(context, adGroupName); 
      if (group != null) 
      { 
       if (user.IsMemberOf(group)) 
       { 
        result = true; 
       } 
      } 
     } 
    } 
    return result; 
} 
+0

謝謝。我可以在.net framework 3.5中運行這個腳本嗎? –

+0

我的項目使用.Net 4.5,但PrincipalContext在.Net 3.5中工作。 – Win

+0

有兩個公共職能。請告訴我哪一個需要先打電話來驗證? –

相關問題