Snippet

Ověření identity libovolného uživatele ve Windows

Přidáno: 21.2.2008       Kategorie: VB.NET - Zabezpečení       Autor: Ondřej Linhart

Záměr tohoto ukázkového kódu je předvést, jak se dá ověřit identita libovolného uživatele ve Windows. Díky tomu můžete například povolit přístup do své aplikace pouze uživatelům, kteří se úspěšně autentizují pomocí svého uživatelského účtu ve Windows (pomocí jména a hesla kterým se přihlašují do systému). Funguje to jak na počítači bez domény, tak i na počítači v doméně. Tímto způsobem se dá velmi dobře a snadno integrovat zabezpečení definované v doméně přímo do vaší aplikace a nemusíte trávit čas vymýšlením vlastních autentizačních mechanismů.

Příklad použití:
Aplikace ve škole, která umožňuje všem členům školy (zaměstnanci, studenti) přistupovat k nějakým datům a tato aplikace bude umístěna na veřejně dostupném počítači. Nikdo, kdo nemá zřízený přihlašovací účet ve škole (v ActiveDirectory domény) se do této aplikace nedostane.

Imports System.Security.Principal
Imports System.Runtime.InteropServices
'Z bezpečnostních důvodů neumožníme třídu dědit
Public NotInheritable Class Security
  'Deklarace funkcí z Win32 API a konstant
  Private Declare Auto Function LogonUser Lib "advapi32.dll" (
    ByVal lpszUsername As String, _
    ByVal lpszDomain As String, _
    ByVal lpszPassword As String, _
    ByVal dwLogonType As Integer, _
    ByVal dwLogonProvider As Integer, _
    ByRef phToken As IntPtr) As Boolean
  Private Declare Auto Function CloseHandle Lib "kernel32.dll" (
    ByVal handle As IntPtr) As Boolean
  Private Const LOGON32_LOGON_INTERACTIVE As Integer = 2
  Private Const LOGON32_PROVIDER_DEFAULT As Integer = 0
  'Private konstruktor neumožní vytvořit instanci třídy
  Private Sub New()
  End Sub
  'Statická funkce pro ověření identity uživatele
  Public Shared Function AuthenticateUser( _
    ByVal domain As String, _
    ByVal userName As String, _
    ByVal password As String) As Boolean
    Dim userToken As IntPtr = IntPtr.Zero
    'Pokus o přihlášení uživatele
    Dim returnValue As Boolean = LogonUser( _
      userName, _
      domain, _
      password, _
      LOGON32_LOGON_INTERACTIVE, _
      LOGON32_PROVIDER_DEFAULT, _
      userToken)
    If Not returnValue Then
      'V případě že funkce selže nebo autentizace
      'neproběhne úspěšně vrací hodnotu False.
      'CloseHandle uvolní unmanaged zdroje
      returnValue = CloseHandle(userToken)
      Return False
    Else
      'Vytvoří identitu a vrátí příslušnou hodnotu,
      'dá se dále použít např. pro ověření, zda-li je uživatel
      'členem určité skupiny (Users, Administrators...)
      Dim identity As New WindowsIdentity(userToken)
      returnValue = CloseHandle(userToken)
      Return identity.IsAuthenticated
    End If
  End Function
End Class

'Použití:
Dim allowUserAccess As Boolean = Security.AuthenticateUser("Doma", "jan.novak", "heslo")
'Pokud není počítač v doméně, použijte jako parametr název počítače 
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.