2010-05-04 5 views
13

Ho accesso limitato a un sito utilizzando l'autenticazione integrata di Windows e disattivando l'accesso anonimo. In questo modo posso quindi mostrare loro il loro vero nome (dalla ricerca su Active Directory e utilizzando la variabile del server LOGON_USER) e svolgere altre attività correlate di Active Directory.Accedi come utente diverso quando si utilizza l'autenticazione integrata di Windows

Come posso quindi richiedere nuovamente le credenziali dell'utente, tramite un collegamento "accedi come altro utente", mostrando il prompt del browser (come si otterrebbe su un browser come Chrome o Firefox, o se il sito non era in la zona 'Intranet' in IE) piuttosto che un Web Form?

Poiché SharePoint offre questa funzionalità, presumo che ci sia un modo per farlo attraverso il codice, ma non so quale codice può fare questo (usando C#). Posso inviare un header 401 che fa apparire il prompt, ma come si conferma quindi se sono loggati?

+0

questo non elimina il pur posa di usare l'autenticazione di Windows? – cortijon

+6

No, perché potresti voler eseguire attività amministrative senza dover uscire da Windows. L'autenticazione di Windows è ancora utilizzata, ma voglio passare da un utente all'altro senza dover eseguire il logout o eseguire "Esegui come" nell'eseguibile del browser. Poiché SharePoint ha questa funzionalità, c'è un certo valore nell'offrirlo. – SamWM

risposta

1

Prova questo approccio. Essa si basa sul codice disassemblato del metodo Microsoft.SharePoint.ApplicationPages.AccessDeniedPage.LogInAsAnotherUser()

Prima di tutto, io sono l'accesso alla pagina AccessDeniedPage utilizzando JavaScript perché Sharepoint fa qualcosa di simile:

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

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

poi, nella tua pagina AccessDeniedPage si utilizza questo:

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(); 
    } 
} 

FIX: è necessario utilizzare l'IIS per funzionare correttamente

Problemi correlati