Войдите как другой пользователь при использовании встроенной проверки подлинности Windows

Я ограничил доступ к сайту, используя встроенную проверку подлинности Windows и отключив анонимный доступ. Таким образом, я могу затем показать им их настоящее имя (просмотрев Active Directory и используя серверную переменную LOGON_USER) и выполнить другие связанные задачи Active Directory.

Как я могу затем снова запросить их учетные данные с помощью ссылки `` Войти как другой пользователь '', отображающей приглашение браузера (например, вы бы получили в браузере, таком как Chrome или Firefox, или если сайт не был в `` Интранете '' зона в IE), а не веб-форму?

Поскольку SharePoint предлагает эту функцию, я предполагаю, что есть способ сделать это с помощью кода, но я не знаю, какой код может это сделать (используя C #). Я могу отправить заголовок 401, который вызывает появление запроса, но как вы затем подтвердите, что они вошли в систему?


person SamWM    schedule 04.05.2010    source источник
comment
Разве это не противоречит цели использования проверки подлинности Windows?   -  person cortijon    schedule 04.05.2010
comment
Нет, потому что вы можете выполнять административные задачи, не выходя из Windows. Аутентификация Windows по-прежнему используется, но я хочу переключаться между пользователями без выхода из системы или запуска от имени в исполняемом файле браузера. Поскольку эта функция есть в SharePoint, она имеет определенную ценность.   -  person SamWM    schedule 04.05.2010


Ответы (2)



Попробуйте такой подход. Он основан на дизассемблированном коде метода Microsoft.SharePoint.ApplicationPages.AccessDeniedPage.LogInAsAnotherUser ()

Прежде всего, я обращаюсь к странице AccessDeniedPage с помощью javascript, потому что Sharepoint делает нечто подобное:

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

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

Затем на своей странице AccessDeniedPage вы используете это:

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

ИСПРАВЛЕНИЕ: вы должны использовать IIS для правильной работы

person Jose M.    schedule 12.12.2014