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".
为什么会这样?
您需要区分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 参考资料。
| 归档时间: |
|
| 查看次数: |
2690 次 |
| 最近记录: |