WindowsIdentity - 组和声明之间的区别

WindowsIdentity - Difference between Groups and Claims

我正在尝试使用 SID-s 检查用户是否属于某些组。

我在使用 WindowsIdentity.Groups,但后来发现有时它不显示用户属于 Administrators 组。

搜索一段时间后,我发现 WindowsIdentity.Claims 工作正常(结果中也包括管理员组)。
我无法在 Claims.

上找到合适的文档

那么,WindowsIdentity 中的组和声明有什么区别,为什么组不显示管理员组而声明显示?
最后,我可以安全地使用 Claims 而不是 Groups 吗?

这是我的代码:

var wi = WindowsIdentity.GetCurrent();

var sidToFind = "S-1-5-32-544"; // Hardcoded the sid of administrators group for demo, but in general this is a parameter of a function on my side

// This will NOT include the sid S-1-5-32-544
var groupSids= wi.Groups
    .Where(item => item.Value == sidToFind);

// This will include the sid S-1-5-32-544 and also all the other results that Groups provides.
var claimSids = wi.Claims
    .Where(item => item.Value == sidToFind));

组和声明之间存在差异。

  • 组使用 WORKGROUP 和 AD
  • 声明适用于 Active Directory 联合身份验证服务

Claims 是一种更复杂的检查用户身份的方法,因为 Claims 不仅针对 ADFS 存在,您还可以使用或创建额外的 claims token provider

当我们为 WindowsIdentity 调用 Groups 方法时,我们有限制:

// Ignore disabled, logon ID, and deny-only groups.

The role of claims

In the claims-based identity model, claims play a pivotal role in the federation process, They are the key component by which the outcome of all Web-based authentication and authorization requests are determined. This model enables organizations to securely project digital identity and entitlement rights, or claims, across security and enterprise boundaries in a standardized way.

因此,如果您只在 NTLM 中工作 - 您可以安全地使用组,但如果您想通过联合工作(例如 SharePoint、Google 等)- 您必须使用声明。声明包含组,但组不包含声明。

为了回答为什么看不到某个组的问题,您需要知道它的属性和位置。正如我在上面所写并给出 link,获取组列表有限制。但是 here 我发现了这个信息:

SID Name Description
S-1-5-32-544 Administrators A built-in group. After the initial installation of the operating system, the only member of the group is the Administrator account. When a computer joins a domain, the Domain Admins group is added to the Administrators group. When a server becomes a domain controller, the Enterprise Admins group also is added to the Administrators group.

因此,如果您的本地管理员组被禁用 - 当您通过 WindowsIdentity 获取它时,即使用户包含在其中,您也看不到它。