7

我有一个 VB.Net 应用程序,它使用当前 Windows 用户进行身份验证,而不要求输入密码。它在启动之前检查该用户是否是“MYDOMAIN\ApplicationUsers”的成员。

如何检查这是否是真实域而不是使用相同名称的不同域?是否有任何证书或公钥可以在本地验证?我更喜欢离线检查,没有第三方机器或数据库等。

在 System.DirectoryServices.ActiveDirectory 命名空间中有一些 Trust an Validate 方法,但它们似乎只检查域间信任并仅使用域名。

4

2 回答 2

1

您的问题是您使用的是字符串,而 mydomain/application 用户之类的字符串在各个域中并不是唯一的。一种可能性是使用预期域中应用程序用户组的 SID 而不是名称。然后,您可以在检查成员资格之前检查组的 SID 以确保它在运行时与预期的应用程序用户组的 sid 匹配。恶意用户更难欺骗 Sid 的域和组部分,然后是域和组名。

最终,如果您在恶意用户拥有的机器上运行代码,那么这只会提高标准,他们仍然可以绕过这个检查。

于 2014-09-24T20:18:58.637 回答
1

我做了一些示例代码,按照 Mike 的建议检查组的 SID。您只需要将组的 SID 放入SecurityIdentifier类的构造函数中,即可针对当前登录的用户进行检查。

Private Sub DoCheck()
    Dim sid As New Security.Principal.SecurityIdentifier("S-0-0-00-0000000000-0000000000-0000000000-000"),
        result As Boolean
    result = IsUserInGroup(sid)
End Sub

Public Shared Function IsUserInGroup(sid As Security.Principal.SecurityIdentifier) As Boolean
    Dim user As UserPrincipal
    user = UserPrincipal.Current
    For Each group As Principal In user.GetGroups()
        If group.Sid.Equals(sid) Then Return True
    Next
    Return False
End Function

要使代码工作,您需要导入System.DirectoryServices.AccountManagement

Imports System.DirectoryServices.AccountManagement

这个命名空间位于微软的System.DirectoryServices.AccountManagement.dll,我相信它从 .Net 4.0 开始可用。

于 2015-03-24T14:23:39.950 回答