2012-10-15 26 views
7

我有一個VB.Net應用程序使用當前的Windows用戶進行身份驗證,而無需詢問密碼。它在啓動之前檢查該用戶是否是「MYDOMAIN \ ApplicationUsers」的成員。如何驗證我的應用程序正在運行的活動目錄域?

如何檢查這是否是真實域名,而不是使用相同名稱的不同域名?是否有任何證書或公鑰需要本地驗證?我寧願離線檢查,沒有第三方機器或數據庫等。

在System.DirectoryServices.ActiveDirectory命名空間中有一些Trust和Validate方法,但它們似乎只檢查域間信任和使用域名只要。

+0

您如何檢查當前用戶現在是否是該組的成員?如果您正在使用AD查詢,則可以使用當前用戶的SID並驗證他們是否爲該組的成員。 – tHand

+0

我正在使用方法[IsInRole(字符串)](http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.applicationservices.user.isinrole(v = vs.80).aspx) My.Application.User對象,使用我的問題中給出的字符串參數。通過使用具有域名稱的字符串,可以通過創建流氓域「輕鬆」僞造該字符串。檢查SID很有意思,它們不是真正的哈希或證書,但如果沒有安全的東西,那就這樣吧。 –

+0

聽起來像雞/雞蛋問題。有.net函數來驗證用戶是他們說他們是誰,但通常涉及到要求他們輸入密碼。如果你不想提示他們,那麼你必須採取他們的話(在這種情況下,域)。這個應用程序是可移植的還是在一個組織內?如果它在一個組織內,則可以使用其他線索來嗅出不誠實的用戶。 – tHand

回答

1

你的問題是,你使用的字符串和字符串像mydomain /應用程序用戶不是唯一的跨域。一種可能性是在預期域中使用應用程序用戶組的SID而不是名稱。然後,您可以在檢查成員資格之前檢查組的SID,以確保它在運行時與預期的應用程序用戶組匹配。如果惡意用戶欺騙Sid的域和組成部分,然後欺騙域和組名,將會困難得多。

最終,如果您在惡意用戶所擁有的計算機上運行代碼,那麼這隻會提高酒吧,他們仍然可以繞過此檢查。

+0

請提供一些關於如何完成的代碼。 – Steve

1

我做了一些示例代碼,檢查組的SID,正如Mike所建議的。您只需要將組的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,我相信。

相關問題