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
fonte
2014-12-12 16:13:55
questo non elimina il pur posa di usare l'autenticazione di Windows? – cortijon
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