簡體   English   中英

使用備用UPN后綴驗證AD用戶

[英]Authenticate AD user with alternate UPN suffix

這個問題可能間接地與這里鏈接的問題相匹配。

我正在基於企業使用的基於Asp.Net 4.0的網站項目上工作。

網站上有一個表格,要求用戶提供其AD用戶名和密碼以及默認情況下選擇的域名。

我知道通過根域名對用戶進行身份驗證的方法。 但是有些用戶的域名(UPN后綴)已被修改。

例如 ,域名是xyz.com 因此,用戶通過user@xyz.com及其密碼進行身份驗證。 但是對於某些用戶,其名稱為user@abc.com

那么,如何用根域名以外的替代UPN后綴來驗證此類用戶呢?

如果第一次嘗試失敗(使用默認域名),請顯示帶有“域名”選項的表格。

或者,為域名提供一個文本框,該文本框會提前填充,用戶可以根據需要進行修改。

如果身份驗證失敗,請確保向他們顯示一條消息,指示他們需要注意您顯示的域名。

更新:

private void AuthenticateUser(string loginID, string pwd) {
  var search = new DirectorySearcher(m_rootDir);
  if (-1 < loginID.IndexOf("@")) {
    search.Filter = "(&(objectClass=user)(SAMAccountName=" + loginID + "))";
  } else { // this is their Common Name
    search.Filter = "(&(objectClass=user)(cn=" + loginID + "))"; // Get User By Full Name
  }
  // more code here
}

經過大量的搜索和試用方法搜索后,我有理由提出了解決方案。

以下是Jorge de Almeida Pinto撰寫的 AD中用戶主體名稱鏈接。 請從此處獲取有關iUPN和eUPN的詳細信息。

我將再次說明我的問題陳述,以使其更加清晰。

情境

  1. 域( domain.com )中AD中只有兩個用戶名為AnilAlex
  2. iUPN for Anil是Anil@domain.com ,而Alex的iUPNAlex@domain.com (默認情況下由廣告本身設置)。
  3. eUPN for Anil留為空白(這意味着它將是Anil@domain.com,這是AD的默認行為) 但是出於任何原因,對於Alex來說,它都被設置為Alex@dummy.com

您可以從Active Directory With C#鏈接中獲得AD交互的想法,我發現它寫得很好。

作為一名程序員,我想編寫代碼以使這兩個用戶都從代碼登錄到AD。

問題

  • Anil@domain.com成功登錄。
  • Alex@dummy.com 無法登錄。

原因

我無法找到完美的根本原因。

但是我的猜測是,AD本身將域名放在@之后(按速率) 由於Alex的域名是dummy.com ,因此AD嘗試找到后綴為@ dummy.com的用戶。 並返回結果,因為找不到用戶。

  1. 解決方案是剖析用戶名和域名。
  2. 根域名(domain.com)作為后綴添加到用戶(具有單獨的域名)。 然后嘗試登錄。

您可能會有其他未經授權的用戶也可以通過這種方式進入的問題。 沒有! 因為密碼需要匹配。

為什么有效?

因為AD能夠在domain.com中找到Alex@domain.com的用戶。

編輯

我提供的解決方案僅在其他用戶具有相同域名的相同sAMAccountName的情況下有效。

但是,如果sAMAccountName本身設置為Alex@dummy.com,該怎么辦 因此,真正的解決方案是-

(1)根據UPN獲取sAMAccountName。

/// <summary>
    /// Get sAMAccountName for matching UserPrincipalName (UPN)
    /// </summary>
    /// <param name="domain">Domain name</param>
    /// <param name="userName">Username</param>
    /// <returns></returns>
    protected string GetSamUsername(string domain, string userName)
    {
        string samName;
        using (var pc = new PrincipalContext(ContextType.Domain, domain))
        {
            var user = UserPrincipal.FindByIdentity(pc, userName); // Search for this user
            if (user == null) return null; // If user is not there, why go forward

            samName = user.SamAccountName;
        }
        return samName;
    }

(2)現在,任何用戶均可登錄。

它還可以幫助我們驗證AD中用戶的身份。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM