2010-05-04 7 views
13

J'ai un accès restreint à un site en utilisant l'authentification Windows intégrée et en désactivant l'accès anonyme. De cette façon, je peux ensuite leur montrer leur vrai nom (en consultant Active Directory et en utilisant la variable de serveur LOGON_USER) et faire d'autres tâches Active Directory. Comment puis-je demander à nouveau les informations d'identification de l'utilisateur via le lien "Connexion en tant qu'utilisateur", en affichant l'invite du navigateur (comme si vous utilisiez un navigateur comme Chrome ou Firefox, ou si le site n'était pas dans la zone 'Intranet' dans IE) plutôt qu'un formulaire Web?Se connecter en tant qu'utilisateur différent lors de l'utilisation de l'authentification Windows intégrée

Étant donné que SharePoint offre cette fonctionnalité, je suppose qu'il existe un moyen de le faire par le biais du code, mais je ne sais pas quel code peut le faire (en utilisant C#). Je peux envoyer un en-tête 401 qui fait apparaître l'invite, mais comment confirmez-vous si elles sont connectées?

+0

Est-ce que cette défaite ne le pur pose d'utiliser l'authentification Windows? – cortijon

+6

Non, car vous pouvez effectuer des tâches administratives sans avoir à vous déconnecter de Windows. L'authentification Windows est toujours utilisée, mais je souhaite passer d'un utilisateur à l'autre sans avoir à me déconnecter ou exécuter «exécuter en tant que» sur l'exécutable du navigateur. Puisque SharePoint possède cette fonctionnalité, il est utile de l'offrir. – SamWM

Répondre

1

Essayez cette approche. Il est basé sur le code désassemblé de la méthode Microsoft.SharePoint.ApplicationPages.AccessDeniedPage.LogInAsAnotherUser()

Tout d'abord, j'accéder à la page AccessDeniedPage en utilisant javascript parce que Sharepoint fait quelque chose de similaire:

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

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

ensuite, dans votre page AccessDeniedPage vous utilisez ceci:

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

CORRECTIF: vous devez utiliser IIS pour fonctionner correctement