ASP.NET MVC 401 - не авторизованный не запрашивает логин - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть приложение MVC, которое обычно использует базовую аутентификацию. Это позволяет нам изменить пользователя приложения на другого пользователя Active Directory для некоторых административных функций. Мы делаем это, устанавливая response.StausCode = 401 таким образом: -

Response.Clear();
Response.StatusCode = (Int32)HttpStatusCode.Unauthorized;
Response.AddHeader("WWW-Authenticate", "Realm=Secured Site");
Response.AddHeader("Refresh", "0;");
Response.End();

Это работает нормально, но сейчас я пытаюсь использовать проверку подлинности Windows в приложении, но все же разрешаю изменять пользователя, используя предыдущий метод. Похоже, это снова работает изначально при загрузке приложения (т. Е. Перейдите на сайт и выберите ссылку действия «changeuser»). Проблема в том, что после того, как вы ушли с индексной страницы, кликнув на ссылку действия «changeuser», пользователь больше не запрашивает вход в систему, даже если установлен 401.

Любое руководство приветствуется.

Ответы [ 2 ]

1 голос
/ 27 января 2012

Вы можете сделать это, однако это требует немного хитрости. Код основан на декомпиляции Microsoft.TeamFoundation.WebAccess с функцией «Войти как другой пользователь» и рефакторинге для использования MVC.

namespace WindwsAuthTest.Controllers {
   public class HomeController : Controller {
      public ActionResult Index() {
         ViewBag.Message = "Welcome to ASP.NET MVC!";
         return View();
      }

      public ActionResult About() {
         return View();
      }

      public ActionResult Logout() {
         return View();
      }

      public ActionResult SignInAsDifferentUser() {

         HttpCookie cookie = base.Request.Cookies["TSWA-Last-User"];

         if (base.User.Identity.IsAuthenticated == false || cookie == null || StringComparer.OrdinalIgnoreCase.Equals(base.User.Identity.Name, cookie.Value)) {

            string name = string.Empty;
            if (base.Request.IsAuthenticated) {
               name = this.User.Identity.Name;
            }

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

            base.Response.AppendHeader("Connection", "close");
            base.Response.StatusCode = 0x191;
            base.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
            base.Response.Write("PageResources.UnauthorizedAccessMessage");
            base.Response.End();
            return RedirectToAction("Index");
         }

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

         return RedirectToAction("Index");
      }
   }
}
0 голосов
/ 13 сентября 2011

Удивительно, но браузеры этого не поддерживают.Я нашел этот вопрос для друга, который задавал похожую вещь в прошлом июне:

Выход пользователя из системы при использовании HTTP Basic аутентификации

Он ссылается на другой вопрос и лучший ответнемного глупо:

Как выйти из системы с веб-сайта, используя аутентификацию BASIC?

Базовая аутентификация не предназначена для управления выходом из системы.Вы можете сделать это, но не полностью автоматически.

Вам нужно сделать так, чтобы пользователь щелкнул ссылку выхода из системы и отправил в ответ «401 Не авторизован», используя ту же область и в той же папке URL.уровень как обычный 401, который вы отправляете, запрашивая логин.

Они должны быть направлены на ввод неправильных учетных данных, например.пустое имя пользователя и пароль, и в ответ вы отправляете обратно страницу «Вы успешно вышли из системы».Неверные / пустые учетные данные будут затем перезаписывать предыдущие правильные учетные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...