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

adr*_*nks 6 .net c# security iprincipal active-directory

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

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

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

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

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

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

adr*_*nks 8

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

在Active Directory中创建组时,会给它两个名称:

替代文字

似乎WindowsPrincipalIsInRole调用时使用了Windows 2000之前的组名.

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


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