IPrincipal.IsInRole() 只有在我截断角色名称时才起作用 - 为什么?

6

我有一个应用程序,它在很大程度上依赖于用户的授权。在其中,我使用 IPrincipal.IsInRole() 来检查用户是否属于正确的组:

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

这通常运行良好,但如果主体是WindowsPrincipal的实例,则会失败(返回不正确的结果)。我发现为了使其正常工作,我必须截断传递给它的角色名称,使其长度为32个字符(包括域名和\):

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

截断角色名称后,问题得到了正确的解决。为什么?这是一个错误/特性/已知问题吗?我有一种直觉,它可能与Win2000域有关,但找不到任何信息。
额外的信息: 这是个问题,因为该应用可以配置为使用Active Directory或“自定义”进行授权(“自定义”是指支持接口的任何授权提供程序 - 可以是基于SQL的、基于文件的等等)。当配置为自定义时,角色很可能不需要被截断,因此我不想在我的代码中处理这个特殊情况。另外,我还有应用程序的另一个部分,使用System.DirectoryServices.AccountManagement命名空间中的类来查找组成员身份。这需要完整的角色名称,如果将其截断,则无法正常工作。

4
曾经有人认为:“32个字符足以扮演任何角色”。 - H H
@Henk:我喜欢它 :) 字符数为32使得搜索变得非常困难,因为你会得到很多关于“Int32”,“Win32”等的结果... - adrianbanks
1个回答

8
经过多次试验和错误,我已经弄清楚了发生了什么。
当在Active Directory中创建一个组时,它会被赋予两个名称:

alt text

似乎在调用IsInRole时,WindowsPrincipal使用了Windows 2000之前的组名
经过广泛搜索,似乎没有任何文档记录这一点。我最接近的是在SO上对类似问题的推测性答案
在我的情况下,我查询的域上的组名称很长,但是之前的Windows 2000名称被截断了(由于某种原因截断为32个字符)。传递长名称不起作用,因为它会检查错误的组名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接