我有一个VB.Net应用程序,它使用当前的Windows用户进行身份验证,而不需要询问密码。它会在启动前检查该用户是否为"MYDOMAIN\ApplicationUsers“的成员。
如何检查这是否是真实域名,而不是使用相同名称的不同域名?是否有要在本地验证的证书或公钥?我更喜欢离线检查,没有第三方机器或数据库等。
在System.DirectoryServices.ActiveDirectory命名空间中有一些信任和验证方法,但它们似乎只检查域间信任,并且只使用域名。
发布于 2014-09-25 04:18:59
您的问题是,您使用的字符串和mydomain/application用户跨域的字符串并不是唯一的。一种可能是使用预期域中应用程序用户组的SID,而不是名称。然后,在检查成员资格之前,您可以检查组的SID,以确保它在运行时与预期的应用程序用户组的sid匹配。恶意用户将更难伪造Sid的域和组部分,而不是域名和组名。
最终,如果你在恶意用户拥有的机器上运行代码,那么这只会提高门槛,他们仍然可以绕过这一检查。
发布于 2015-03-24 22:23:40
我做了一些示例代码,按照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开始就可以使用它了。
https://stackoverflow.com/questions/12897494
复制相似问题