我有一个VB.Net应用程序,可以使用当前的Windows用户进行身份验证,而无需输入密码。它在启动之前检查该用户是“MYDOMAIN \ ApplicationUsers”的成员。
如何检查这是真正的域名而不是使用相同名称的其他域名?是否有任何证书或公钥可在本地验证?我宁愿离线检查,没有第三方机器或数据库等。
在System.DirectoryServices.ActiveDirectory命名空间中有一些Trust和Validate方法,但它们似乎只检查域间信任并仅使用域名。
答案 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起就可用。