2009-08-06 7 views
8

Ich habe eine interne Anwendung, die zwei Sicherheitsstufen hat. FormsAuthentication für Client-Anwendungen und NTLM Integrated Authentication für Management-Schnittstelle.Imitieren von Benutzern durch NTLM

Ich kann mich einfach als Client ausgeben, indem ich einfach das richtige .ASPXAUTH-Cookie mit den Methoden der FormsAuthentication-Klasse erstelle. Die Erzeugung eines HTTP-Authentifizierungs-Headers für NTLM ist jedoch bisher nicht möglich.

Ich hatte meine Hoffnungen, als ich diesen Artikel (http://msdn.microsoft.com/en-us/library/ms998358.aspx#paght000025_usingimpersonation) fand, aber dann erkannte ich, dass es nur einen Kontext erstellt, um Code für eine Dauer der Anfrage auszuführen. Und ich möchte meine gesamte Sitzung wechseln, damit der Server denkt, dass ich eine andere Domänenanmeldung verwende. Ich verfüge über Administratorrechte für mein Konto. Es dient also nicht dazu, Domänenkennwörter zu umgehen oder zu stehlen.

Ist es überhaupt möglich? Vielen Dank.

Antwort

7

Nehmen wir an, Sie haben die Formularauthentifizierung aktiviert ASP.NET App mit Login-Formular login.aspx und Ihre Benutzer sind in der DB gespeichert. Jetzt möchten Sie sowohl die Formular- als auch die Windows-Authentifizierung unterstützen. Das ist was ich mache:

Für Formulare auth verwende ich SQL DB mit, sagen wir, Benutzer Tabelle. Ich füge dieser Tabelle neue Spalte mit dem Namen WindowsUserName, in dem ich den Windows-Benutzernamen in Form COMPUTER \ User

In login.aspx Form ich eine Methode hinzufügen speichern werden, die eine Antwort sendet, das wird zeigt Fenster einloggen:

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

Irgendwo ich habe einen Link wie <a href="login.aspx?use=windows">Admin</a>

In login.aspx Page_Load ich hinzugefügt haben:

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 und GetApplicationUser sind meine Methoden nur als Beispiel.

+0

Das ist, zwei Authentifizierungsschemata regeln zwei verschiedene Teile der Website, und ich kann sie nicht mischen. Ich plane jedoch, sie in zwei verschiedene Anwendungen zu trennen. Sobald ich fertig bin - ich kann Forms AuthCookie verwenden, aber immer noch mit Domain-Konten validieren. –