【问题标题】:IPrincipal.IsInRole() only works when I truncate the role names - why?IPrincipal.IsInRole() 仅在我截断角色名称时才有效 - 为什么?
【发布时间】: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 个字符很难搜索,因为 Int32Win32 等的点击率很高...

标签: c# .net security active-directory iprincipal


【解决方案1】:

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

在 Active Directory 中创建组时,会为其指定两个名称:

当调用IsInRole 时,似乎WindowsPrincipal 使用的是Windows 2000 之前的组名

经过广泛搜索,这似乎没有在任何地方记录。我得到的最接近的是this speculative answer 到 SO 上的类似问题。


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

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 2022-10-26
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多