2012-10-15 13 views
7

Possiedo un'applicazione VB.Net che esegue l'autenticazione utilizzando l'utente Windows corrente senza chiedere la password. Controlla che questo utente sia membro di "MYDOMAIN \ ApplicationUsers" prima dell'avvio.Come convalidare il dominio di directory attivo in cui è in esecuzione la mia app?

Come verificare se questo è il dominio reale e non uno diverso con lo stesso nome? Ci sono certificati o chiavi pubbliche da convalidare localmente? Preferirei controllare questo offline, senza una macchina o un database di terze parti ecc.

Nello spazio dei nomi System.DirectoryServices.ActiveDirectory ci sono alcuni metodi Trust e Validate ma sembrano controllare solo la fiducia tra domini e l'uso di un nome di dominio solo.

+0

Come stai verificando che l'utente corrente sia un membro di questo gruppo ora? Se si utilizzano query AD, è possibile utilizzare il SID dell'utente corrente e verificare che siano membri del gruppo. – tHand

+0

Sto usando il metodo [IsInRole (stringa)] (http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.applicationservices.user.isinrole (v = vs.80) .aspx) sul Oggetto My.Application.User, utilizzando il parametro stringa fornito nella mia domanda. Usando una stringa con il nome del dominio questo è "facilmente" falsificato creando un dominio canaglia. Il controllo del SID è interessante, non sono veri hash o cert ma se non c'è nulla di sicuro così sia. –

+0

Sembra un problema di pollo/uovo. Ci sono funzioni .net per convalidare che l'utente è chi dicono di essere, ma che di solito implica chiedere loro una password. Se non si desidera chiedere loro, è necessario prendere la parola (in questo caso DOMAIN). Questa applicazione è pensata per essere portabile o all'interno di un'organizzazione? Se è all'interno di un'organizzazione, puoi usare altri indizi per fiutare un utente disonesto. – tHand

risposta

1

Il problema è che si utilizzano stringhe e stringhe come mydomain/gli utenti dell'applicazione non sono univoci nei domini. Una possibilità è utilizzare il SID del gruppo di utenti dell'applicazione nel dominio previsto anziché il nome. Quindi è possibile controllare il SID del gruppo per assicurarsi che corrisponda al sid per il gruppo di utenti dell'applicazione previsto in fase di esecuzione prima di controllare l'appartenenza. Sarebbe molto più difficile per un utente malintenzionato spoofare il dominio e raggruppare parti di Sid, quindi il dominio e il nome del gruppo.

In definitiva se si sta eseguendo il codice su un computer di proprietà dell'utente malintenzionato, questo solleva la barra e potrebbe comunque aggirare questo controllo.

+0

Si prega di fornire un codice su come questo sarebbe stato fatto. – Steve

1

Ho fatto qualche esempio di codice che controlla il SID del gruppo come suggerito da Mike. Devi solo inserire il SID del tuo gruppo nel costruttore della classe SecurityIdentifier per fare in modo che il controllo funzioni contro l'utente attualmente connesso.

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 

per far funzionare il codice è necessario importare System.DirectoryServices.AccountManagement:

Imports System.DirectoryServices.AccountManagement 

Questo spazio dei nomi si trova in System.DirectoryServices.AccountManagement.dll di Microsoft che è disponibile da quando Net 4.0 credo.

Problemi correlati