如何验证我的应用程序正在运行的活动目录域?

时间:2012-10-15 14:11:47

标签: vb.net security active-directory

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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

此命名空间位于Microsoft的System.DirectoryServices.AccountManagement.dll中,自我认为.Net 4.0起就可用。