gpt4 book ai didi

c# - IPrincipal.IsInRole() 仅在我截断角色名称时有效 - 为什么?

转载 作者:太空狗 更新时间:2023-10-29 21:25:09 27 4
gpt4 key购买 nike

我有一个严重依赖用户授权的应用程序。在其中,我使用 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 域有关,但找不到任何关于它的信息。

<子>一些额外的信息:
这是一个问题,因为可以将应用程序配置为使用事件目录或“自定义”进行授权(“自定义”是支持接口(interface)的任何授权提供程序——可以是基于 SQL 的、基于文件的,等等)。配置自定义后,角色很可能不需要截断,因此我不想在我的代码中处理这种特殊情况。此外,我还有应用程序的另一部分,它使用 System.DirectoryServices.AccountManagement 命名空间中的类来查找组成员资格。这需要完整的角色名称,如果它们被截断则不起作用。

最佳答案

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

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

alt text

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

经过广泛搜索后,似乎没有任何地方对此进行记录。我得到的最接近的是 this speculative answer到这里关于 SO 的类似问题。


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

关于c# - IPrincipal.IsInRole() 仅在我截断角色名称时有效 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3777099/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com