2009-08-06 20 views
8

Ho un'applicazione interna con due livelli di sicurezza. FormsAuthentication per l'applicazione client-face e NTLM Integrated authentication per l'interfaccia di gestione.Impersonare utenti tramite NTLM

Posso facilmente impersonare i client creando semplicemente il cookie .ASPXAUTH appropriato con i metodi della classe FormsAuthentication. Tuttavia la generazione dell'intestazione dell'autenticazione HTTP per NTLM è al di fuori di me finora.

Ho avuto le mie speranze quando ho trovato questo articolo (http://msdn.microsoft.com/en-us/library/ms998358.aspx#paght000025_usingimpersonation) ma poi ho realizzato che crea solo un contesto per eseguire il codice per una durata della richiesta. E vorrei passare l'intera sessione per far pensare al server che sto usando un altro accesso al dominio. Ho privilegi amministrativi sul mio account, quindi non è per lo scopo di rovinare o rubare le password di dominio.

E 'anche possibile? Grazie.

risposta

7

Supponiamo che l'app ASP.NET sia abilitata per l'autenticazione basata su form con il modulo di accesso login.aspx e che gli utenti siano memorizzati nel DB. Ora vorresti supportare l'autenticazione di entrambi, Forms e Windows. Questo è quello che faccio:

Per i moduli auth utilizzo DB SQL con, diciamo, tabella Utenti. Aggiungo a questa tabella nuova colonna denominata WindowsUserName in cui io salverò il nome di utente di Windows in forma COMPUTER \ User

In forma login.aspx aggiungo un metodo, che invierà una risposta che mostra la finestra login:

private void ActivateWindowsLogin() 
{ 
    Response.StatusCode = 401; 
    Response.StatusDescription = "Unauthorized"; 
    Response.End(); 
} 

Da qualche parte ho un link come <a href="login.aspx?use=windows">Admin</a>

In Page_Load login.aspx ho aggiunto:

if (Request.QueryString["use"] == "windows") 
{ 
    var windowsuser = Request.ServerVariables["LOGON_USER"]; 
    if (windowsuser.Length == 0) 
     ActivateWindowsLogin(); 
    else 
    { 
     // get userId from DB for Windows user that was authenticated by IIS 
     // I use userId in .ASPXAUTH cookie 
     var userId = GetUserIdForWindowsUser(windowsuser); 
     if (userId > 0) //user found 
     { 
      // here we get User object to check roles or other stuff 
      var user = GetApplicationUser(userId); 
      // perform additional checks here and call ActivateWindowsLogin() 
      // to show login again or redirect to access denied page. 
      // If everythig is OK, set cookie and redirect 
      FormsAuthentication.SetAuthCookie(userId.ToString(), false); 
      Response.Redirect(FormsAuthentication.GetRedirectUrl(userId.ToString(), false), true); 
     } 
     else //user not found 
      ActivateWindowsLogin(); 
    } 
} 
else 
{ 
    //your Forms auth routine 
} 

GetUserIdForWindowsU ser e GetApplicationUser sono i miei metodi solo per l'esempio.

+0

In questo caso, due schemi di autenticazione regolano due diverse parti del sito Web e non è possibile combinarle. Ho intenzione di separarli in due diverse applicazioni però. Una volta fatto, posso usare Forms AuthCookie, ma continuo a convalidare con gli account di dominio. –

Problemi correlati