2010-05-04 8 views
13

Ich habe den Zugriff auf eine Site eingeschränkt, indem ich die integrierte Windows-Authentifizierung verwendet und den anonymen Zugriff deaktiviert habe. Auf diese Weise kann ich ihnen dann ihren echten Namen zeigen (indem ich Active Directory aufrufe und die Servervariable LOGON_USER verwende) und andere verwandte Active Directory-Aufgaben ausführen.Bei Verwendung der integrierten Windows-Authentifizierung als anderer Benutzer anmelden

Wie kann ich dann erneut auf ihre Benutzeranmeldeinformationen durch einen Link "Anmelden als anderer Benutzer" mit der Browser-Eingabeaufforderung (wie in einem Browser wie Chrome oder Firefox oder wenn die Website nicht in war) zugreifen die Intranet-Zone in IE) statt ein Web-Formular?

Da SharePoint diese Funktionalität bietet, gehe ich davon aus, dass es eine Möglichkeit gibt, dies über Code zu tun, aber ich weiß nicht, welcher Code das kann (mit C#). Ich kann einen 401-Header senden, der die Eingabeaufforderung anzeigt, aber wie bestätigen Sie dann, ob sie angemeldet sind?

+0

ist dies nicht die pur besiegen Pose der Verwendung der Windows-Authentifizierung? – cortijon

+6

Nein, weil Sie administrative Aufgaben erledigen möchten, ohne sich von Windows abmelden zu müssen. Die Windows-Authentifizierung wird weiterhin verwendet, ich möchte jedoch zwischen den Benutzern wechseln, ohne sich abmelden oder als ausführbare Datei ausführen zu müssen. Da SharePoint diese Funktionalität bietet, ist es sinnvoll, sie anzubieten. – SamWM

Antwort

1

diesen Ansatz versuchen. Es basiert auf zerlegten Code der Methode Microsoft.SharePoint.ApplicationPages.AccessDeniedPage.LogInAsAnotherUser()

Zunächst einmal, ich bin die AccessDeniedPage Seite mit Javascript Zugriff auf, weil Sharepoint macht etwas Ähnliches:

function GoToSignAs() { 
    window.location.replace("./SignAs.aspx?signAs=true&returnUrl=" + window.location.toString()); 
} 

<a onclick="GoToSignAs(); return false;" href="javascript:;">SignAs</a> 

dann auf Ihrer Seite AccessDeniedPage Sie verwenden diese:

public partial class SignAs : Page 
{ 
    private const string LoginAttempts = "LoginAttempts"; 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     HttpContext current = HttpContext.Current; 
     if (current == null) 
     { 
      throw new InvalidOperationException(); 
     } 
     if (GetUrlParameter<bool>("signAs")) 
     { 
      HandleSignAs(current, GetUrlParameter<string>("returnUrl")); 
     } 
    } 

    // ... 

    private static void HandleSignAs(HttpContext context, string returnUrl) 
    { 
     int attempts = 0; 
     HttpCookie attemptsCookie = context.Request.Cookies[LoginAttempts]; 
     if (attemptsCookie == null || string.IsNullOrEmpty(attemptsCookie.Value)) 
     { 
      attemptsCookie = new HttpCookie(LoginAttempts); 
     } 
     else 
     { 
      attempts = int.Parse(attemptsCookie.Value, CultureInfo.InvariantCulture); 
     } 

     if (!string.IsNullOrEmpty(context.Request.Headers["Authorization"])) 
     { 
      // Attempts are counted only if an authorization token is informed. 
      attempts++; 
     } 

     if (attempts>1) 
     { 
      attemptsCookie.Value = string.Empty; 
      context.Response.Cookies.Add(attemptsCookie); 
      context.Response.Redirect(returnUrl, true); 
     } 
     else 
     { 
      attemptsCookie.Value = attempts.ToString(CultureInfo.InvariantCulture); 
      context.Response.Cookies.Add(attemptsCookie); 
      SendEndResponse(context, 401, "401 Unauthorized"); 
     } 
    } 

    private static void SendEndResponse(HttpContext context, int code, string description) 
    { 
     HttpResponse response = context.Response; 
     context.Items["ResponseEnded"] = true; 
     context.ClearError(); 

     response.StatusCode = code; 
     response.Clear(); 
     response.StatusDescription = description; 

     response.AppendHeader("Connection", "close"); 
     response.AddHeader("WWW-Authenticate", "Negotiate"); 
     response.AddHeader("WWW-Authenticate", "NTLM"); 

     response.End(); 
    } 
} 

UPDATE: Sie müssen den IIS verwenden, um richtig zu funktionieren

Verwandte Themen