使用 Windows 身份验证时,IIS 如何获取 WindowsPrincipal 上的数据?

How does IIS get data on WindowsPrincipal when using Windows Authentication?

提问人:BVernon 提问时间:6/5/2023 更新时间:6/6/2023 访问量:25

问:

对于使用 Windows 身份验证的内部应用程序,我可以使用以下代码在 C# 中获取 WindowsPrincipal 对象:

var winPrincipal = (WindowsPrincipal)HttpContext.Current.User;

此信息(包括用户所在的 Sam 名称和域组,包含在此对象中)是否直接从用户的计算机传达给 IIS,或者 IIS 是否必须查询 LDAP?

我发现从应用程序代码查询LDAP不是免费操作,所以我想知道如果IIS正在查询LDAP来构造WindowsPrincipal对象,并且如果它没有查询LDAP,那么如果我只是信任IIS中的WindowsPrincipal对象而不查询LDAP,这是否会引入任何安全问题(即攻击者可能会将他们并不真正在的组添加到他们的票证中。请求)?

ASP.NET-MVC 性能 安全 IIS LDAP

评论


答:

1赞 Gabriel Luci 6/6/2023 #1

Windows 身份验证使用来自用户计算机的访问令牌,但服务器会验证它是否有效。

身份验证组存储在令牌中,因此不会发出 LDAP 请求。

如果您需要用户帐户中未存储在令牌中的任何信息,则需要自行发出 LDAP 请求。最有效的方法是使用 SID 直接绑定到用户的对象,您已经拥有该对象:

var identity = (WindowsIdentity) HttpContext.Current.User.Identity;

var user = new DirectoryEntry($"LDAP://<SID={identity.User.Value}>");

//Ask for only the attributes you want to read.
//If you omit this, it will end up getting every attribute with a value,
//which is unnecessary.
user.RefreshCache(new [] { "givenName", "sn" });

var firstName = user.Properties["givenName"].Value;
var lastName = user.Properties["sn"].Value;

如果您担心发出LDAP请求时的效率,我不久前写了一篇文章来讨论这个问题: Active Directory:更好的性能