6

我有一个严重依赖用户授权的应用程序。在其中,我IPrincipal.IsInRole()用来检查用户是否在正确的组中:

IPrincipal principal = Thread.CurrentPrincipal;
bool inRole = principal.IsInRole("mydomainname\some role with a long name");

这在大多数情况下都可以正常工作,但如果主体是 a 的实例,则会失败(返回不正确的结果)WindowsPrincipal。我发现要使其正常工作,我必须将传入的角色名称截断为 32 个字符长(包括域名和\):

IPrincipal principal = Thread.CurrentPrincipal; // <- returns a WindowsPrincipal
bool inRole = principal.IsInRole("mydomainname\some role with a lo");

然后截断角色名称可以正常工作。为什么?这是一个错误/功能/记录的问题吗?我有一种暗示,它可能与 Win2000 域有关,但找不到任何信息。

一些额外信息:
这是一个问题,因为应用程序可以配置为使用活动目录或“自定义”进行授权(“自定义”是任何支持接口的授权提供程序 - 可以是基于 SQL 的、基于文件的等) ..)。配置自定义时,角色很可能不需要截断,因此我不想在我的代码中处理这种特殊情况。此外,我还有应用程序的另一部分使用System.DirectoryServices.AccountManagement命名空间中的类来查找组成员资格。这需要完整的角色名称,如果它们被截断,则不起作用。

4

1 回答 1

8

经过多次试验和错误,我已经弄清楚发生了什么。

在 Active Directory 中创建组时,会为其指定两个名称:

替代文字

似乎是WindowsPrincipal 在被调用时使用 Windows 2000 之前的组名IsInRole

在广泛搜索之后,这似乎没有在任何地方记录。我得到的最接近的是这个关于 SO 的类似问题的推测性答案。


在我的例子中,我在域上查询的组有一个长名称,但是一个截断的 Windows 2000 之前的名称(由于某种原因被截断为 32 个字符)。传入长名称不起作用,因为它检查了错误的组名。

于 2010-09-23T15:20:45.207 回答