2010-05-04 21 views
13

Tengo acceso restringido a un sitio mediante el uso de Autenticación de Windows integrada y la desactivación del acceso anónimo. De esta forma, puedo mostrarles su nombre real (al buscar en Active Directory y usar la variable de servidor LOGON_USER) y realizar otras tareas relacionadas de Active Directory.Inicie sesión como un usuario diferente al utilizar la Autenticación de Windows integrada

¿Cómo puedo solicitar nuevamente sus credenciales de usuario, a través de un vínculo "iniciar sesión como otro usuario", mostrando el indicador del navegador (como si estuviera en un navegador como Chrome o Firefox, o si el sitio no estaba en la zona 'Intranet' en IE) en lugar de un formulario web?

Dado que SharePoint ofrece esta funcionalidad, supongo que hay una forma de hacerlo a través del código, pero no sé qué código puede hacer esto (usando C#). Puedo enviar un encabezado 401 que hace que aparezca el mensaje, pero ¿cómo se confirma si están conectados?

+0

no esta derrota el pur plantear el uso de Autenticación de Windows? – cortijon

+6

No, porque es posible que desee realizar tareas administrativas sin tener que cerrar sesión en Windows. La autenticación de Windows todavía se usa, pero quiero cambiar entre los usuarios sin tener que desconectarme o ejecutar 'ejecutar como' en el ejecutable del navegador. Como SharePoint tiene esta funcionalidad, tiene algún valor ofrecerla. – SamWM

Respuesta

1

probar este enfoque. Se basa en el código desensamblado del Microsoft.SharePoint.ApplicationPages.AccessDeniedPage.LogInAsAnotherUser método()

En primer lugar, estoy accediendo a la página AccessDeniedPage usando javascript porque Sharepoint hace algo similar:

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

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

Luego, en su página de AccessDeniedPage utiliza este:

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

REVISIÓN: debe utilizar el IIS para que funcione correctamente

Cuestiones relacionadas