ASP.NET中的Windows身份验证模式使用Active Directory组名称(Windows 2000之前的版本)?

Ter*_*eld 9 asp.net asp.net-mvc webforms active-directory windows-authentication

这是背景.我有一个.NET MVC v1.0项目,我试图通过使用Windows身份验证模式来保护它.所以我将web.config设置为:

<authentication mode="Windows" />
Run Code Online (Sandbox Code Playgroud)

然后进入我的控制器并执行以下操作:

[Authorize(Roles="IT")]
public class LicenseController : Controller
Run Code Online (Sandbox Code Playgroud)

在AD中,我们有一个名为"IT"的小组,而我和其他许多小组都是这个小组的一部分.一旦我有了这个,我开始一个调试会话,并试图去控制器中的任何一个动作,我遇到了一个401.我搜索高低寻找某个地方,我搞砸了小狗,找不到任何东西错误.经过一段时间的努力,我决定尝试将"授权"更改为特定用户,看看是否有效.所以我把它改成了以下内容:

[Authorize(Users="domain\\tnederveld")]
Run Code Online (Sandbox Code Playgroud)

而且看起来很有效.所以我去了一个不同的小组,我是其中的一员,并取出了用户授权声明,并且有效.我开始研究两个AD组之间的差异,唯一不同的是第二组我尝试了"组名(pre-Windows 2000):"是相同的."IT"组"组名(pre-Windows 2000):"是"IT Associates".所以我尝试将authorize语句更改为:

[Authorize(Roles="IT Associates")]
Run Code Online (Sandbox Code Playgroud)

它开始工作了.我确信这是一个MVC问题,所以为了确保我在常规的Web Forms项目上尝试它,并遇到了同样的问题.

真正的问题是,当您使用属于System.DirectoryServices.AccountManagement的UserPrincipal时,它会在使用.GetGroups()方法时返回组"IT".

为什么会这样?

mar*_*c_s 3

您需要区分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 参考资料