Asp.net

ASP.NET 中的 Windows 身份驗證模式使用 Active Directory 組名(Windows 2000 之前)?

  • January 12, 2010

這是背景。我有一個 .NET MVC v1.0 項目,我試圖通過使用 Windows 身份驗證模式來保護它。所以我將 web.config 設置為:

<authentication mode="Windows" />

然後進入我的控制器並執行以下操作:

[Authorize(Roles="IT")]
public class LicenseController : Controller

在 AD 中,我們有一個名為“IT”的小組,我是這個小組中的許多其他人。完成此操作後,我開始調試會話並嘗試執行該控制器中的任何操作,但遇到了 401。錯誤的。經過一段時間的掙扎,我決定嘗試將“授權”更改為特定使用者,看看是否有效。所以我將其更改為以下內容:

[Authorize(Users="domain\\tnederveld")]

低,看,這行得通。所以我去添加了一個不同的組,我是其中的成員,並拿出了使用者授權聲明,這很有效。我開始研究兩個 AD 組之間的差異,唯一不同的是在第二組中我嘗試了“組名稱(Windows 2000 之前):”是相同的。“IT”組“組名稱(Windows 2000 之前):”是“IT Associates”。所以我嘗試將授權聲明更改為:

[Authorize(Roles="IT Associates")]

它開始工作了。我確信這是一個 MVC 問題,所以為了確保我在一個正常的 Web 窗體項目中嘗試過它並且遇到了同樣的問題。

真正的問題是,當您使用屬於 System.DirectoryServices.AccountManagement 的 UserPrincipal 時,它會在使用 .GetGroups() 方法時返回組“IT”。

為什麼會這樣?

您需要將AD 中的條目可以具有的各種名稱分開:

  • 名稱本身通常是 CN 屬性 - 通用名稱。這是 LDAP 字元串中的“CN=xxx”部分。這是IT- 這就是 System.DirectoryServices.AccountManagement 將返回的 - 它是“Active Directory”最常見的名稱
  • “IT Associates”名稱是 Windows 2000 之前的版本,或者sAMAccountName- 在 AD 出現之前 Windows NT 使用的東西 - 本地使用者和/或組名稱(SAM = 安全帳戶管理或類似名稱)。每個域的 SAM 帳戶名稱必須是唯一的 - 即使在當今巨大的 AD 森林中也是如此。

不幸的是,許多 Windows API 呼叫仍然基於該名稱 - 因為它們(並且需要)向後兼容早期的 Windows 版本。ASP.NET 成員系統使用這些呼叫,因此將使用您的domain/tnederveld使用者名和IT Associates組 - 這些是您的對象的 SAM 帳戶名

不確定您是否可以做很多事情 - 請注意,在 AD 環境中,您的任何使用者或組都有過多的“名稱” - 始終非常清楚您在談論哪個!

有關所有 AD 屬性的詳細列表,請參閱 Richard Mueller 的帶有Active Directory 參考資料的優秀網站

引用自:https://stackoverflow.com/questions/2049341