我的应用程序很大程度上依赖于用户的授权。在其中,我使用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或“custom”进行授权(“custom”是支持接口的任何授权提供程序 - 可以是基于SQL的,基于文件的等等)。配置自定义时,角色很可能不需要截断,因此我不想在我的代码中处理这种特殊情况。此外,我还有另一部分应用程序使用System.DirectoryServices.AccountManagement
命名空间中的类来查找组成员身份。这需要完整的角色名称,如果被截断则不起作用。
子>
答案 0 :(得分:8)
经过多次反复试验,我已经弄清楚发生了什么。
在Active Directory中创建组时,会给出两个名称:
似乎 WindowsPrincipal在调用IsInRole
时使用Windows 2000以前的组名。
经过广泛搜索后,似乎没有记录在任何地方。我得到的最接近的是this speculative answer这里的类似问题。
在我的情况下,我在域上查询的组有一个长名称,但是截断的Windows 2000之前的名称(由于某种原因被截断为32个字符)。传入长名称不起作用,因为它检查错误的组名。