我有一个应用程序,它在很大程度上依赖于用户的授权。在其中,我使用 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
命名空间中的类来查找组成员身份。这需要完整的角色名称,如果将其截断,则无法正常工作。