"Войти как другой пользователь" MVC 4 Аутентификация Windows

У меня есть проект интрасети, написанный в MVC 4, который использует проверку подлинности Windows для авторизации и аутентификации пользователей.

Мне нужно добавить функциональность "Войти как другой пользователь".

После некоторого поиска я нашел это решение, которое предлагает вернуть 401, и создал следующее действие (которое вызывается с использованием формы):

    // 
    // POST: /Home/LogOut

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOut()
    {
        return new HttpUnauthorizedResult();
    }

Действие вызывается, и браузер открывает окно имени пользователя и пароля, однако по мере того, как результат перенаправляется обратно на действие, возвращается 401.

Как перенаправить пользователя назад к предыдущему действию после входа в систему с новыми учетными данными?

Есть ли способ аннулировать учетные данные на стороне сервера вместо того, чтобы просто возвращать 401?

Ответ 1

Люди обратный инженерный\декомпилированный некоторый код из Sharepoint, который, случается, имеет эту функцию.

Я тестировал его в приложении ASP.NET MVC 5 и работал как ожидалось.

Код основан на декомпиляции Microsoft.TeamFoundation.WebAccess, который имеет "Войти как другой пользовательской" функции.

public ActionResult LogOut()
{
    HttpCookie cookie = Request.Cookies["TSWA-Last-User"];

    if(User.Identity.IsAuthenticated == false || cookie == null || StringComparer.OrdinalIgnoreCase.Equals(User.Identity.Name, cookie.Value))
    {
        string name = string.Empty;

        if(Request.IsAuthenticated)
        {
            name = User.Identity.Name;
        }

        cookie = new HttpCookie("TSWA-Last-User", name);
        Response.Cookies.Set(cookie);

        Response.AppendHeader("Connection", "close");
        Response.StatusCode = 401; // Unauthorized;
        Response.Clear();
        //should probably do a redirect here to the unauthorized/failed login page
        //if you know how to do this, please tap it on the comments below
        Response.Write("Unauthorized. Reload the page to try again...");
        Response.End();

        return RedirectToAction("Index");
    }

    cookie = new HttpCookie("TSWA-Last-User", string.Empty)
    {
        Expires = DateTime.Now.AddYears(-5)
    };

    Response.Cookies.Set(cookie);

    return RedirectToAction("Index");

}

Источник:

Признать пользователя как другого пользователя при использовании проверки подлинности Windows в asp.net

Ответ 2

Этот метод всегда будет регистрировать пользователя и перенаправлять его на главную страницу. Я также добавил [AllowAnonymous], чтобы каждый мог получить доступ к этому методу.

    [AllowAnonymous]
    public ActionResult LogOut()
    {
        HttpCookie cookie = Request.Cookies["TSWA-Last-User"];

        cookie = new HttpCookie("TSWA-Last-User", string.Empty)
        {
            Expires = DateTime.Now.AddYears(-5)
        };
        Response.Cookies.Set(cookie);

        Response.AppendHeader("Connection", "close");
        Response.StatusCode = 401; // Unauthorized;
        Response.Clear();

        // redirect to home
        Response.Write("<script type='text/javascript'>");
        Response.Write("var getUrl = window.location; var baseUrl = getUrl.protocol + " + 
           "'//' + getUrl.host + '/' + getUrl.pathname.split('/')[1]; window.location.href = baseUrl; ");
        Response.Write("</script>");
        Response.End();           

        return RedirectToAction("Index");

    }