我有一个严重依赖用户授权的应用程序。在其中,我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
命名空间中的类来查找组成员资格。这需要完整的角色名称,如果它们被截断,则不起作用。