【发布时间】:2010-09-23 09:44:39
【问题描述】:
我有一个严重依赖用户授权的应用程序。在其中,我使用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 域有关,但找不到任何信息。
一些额外的信息:
这是一个问题,因为可以将应用程序配置为使用活动目录或“自定义”进行授权(“自定义”是任何支持接口的授权提供程序 - 可以是基于 SQL 的、基于文件的等)。配置自定义后,角色很可能不需要截断,因此我不想在我的代码中处理这种特殊情况。此外,我还有应用程序的另一部分使用 System.DirectoryServices.AccountManagement 命名空间中的类来查找组成员资格。这需要完整的角色名称,如果它们被截断,则不起作用。
【问题讨论】:
-
有人曾经认为:“32 个字符足以胜任任何角色”
-
@Henk:我喜欢 :) 32 个字符很难搜索,因为
Int32、Win32等的点击率很高...
标签: c# .net security active-directory iprincipal