这是背景。我有一个 .NET MVC v1.0 项目,我试图通过使用 Windows 身份验证模式来保护它。所以我将 web.config 设置为:
<authentication mode="Windows" />
然后进入我的 Controller 并执行以下操作:
[Authorize(Roles="IT")]
public class LicenseController : Controller
在 AD 中,我们有一个名为“IT”的组,我还有很多其他人都属于这个组。一旦我有了这个,我就开始了一个调试 session 并尝试去那个 Controller 中的任何 Action ,我遇到了一个 401。我搜索高低寻找我搞砸了狗的地方,但找不到任何东西错误的。经过一段时间的努力,我决定尝试将“授权”更改为特定用户,看看是否有效。所以我将其更改为以下内容:
[Authorize(Users="domain\\tnederveld")]
低,瞧,这奏效了。所以我去添加了一个我所属的不同组,然后取出用户授权声明,这奏效了。我开始研究两个 AD 组之间的差异,唯一不同的是在第二个组中我尝试了“组名称(Windows 2000 之前):”相同。 “IT”组“Group name (pre-Windows 2000):”是“IT Associates”。所以我尝试将授权语句更改为:
[Authorize(Roles="IT Associates")]
它开始工作了。我认为这是一个 MVC 问题,所以确保我在一个常规的 Web 表单项目中尝试过它并且遇到了同样的问题。
真正的问题在于,当您使用属于 System.DirectoryServices.AccountManagement 的 UserPrincipal 时,它会在使用 .GetGroups() 方法时返回组“IT”。
为什么会这样?
最佳答案
你需要把各种分开姓名 AD 中的条目可以具有:
IT
- 这就是 System.DirectoryServices.AccountManagement 将返回的内容 - 它是“Active Directory”最常见的名称 sAMAccountName
- 在出现 AD 之前 Windows NT 曾经使用过的东西 - 本地用户和/或组名(SAM = 安全帐户管理或类似的东西)。每个域的 SAM 帐户名称都需要是唯一的 - 即使在当今巨大的 AD 林中也是如此。 不幸的是,许多 Windows API 调用仍然基于该名称 - 因为它们(并且需要)向后兼容早期的 Windows 版本。 ASP.NET 成员(member)系统使用这些调用,因此将使用您的
domain/tnederveld
用户名和 IT Associates
组 - 这些是您的对象的 SAM 帐户名不确定您是否可以做很多事情 - 请注意,在 AD 环境中,您的任何用户或组都有过多的“名称” - 始终非常清楚您在谈论哪个!
有关所有 AD 属性的详细列表,请参阅 Richard Mueller 的 excellent web site与 Active Directory reference material .
关于asp.net - ASP.NET 中的 Windows 身份验证模式使用 Active Directory 组名(Windows 2000 之前)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2049341/