ASP.NET MVC 401 - Unathorized不提示登录

时间:2011-09-12 12:47:21

标签: asp.net-mvc iis windows-authentication basic-authentication

我有一个MVC应用程序,通常使用基本身份验证。这允许我们将应用程序用户更改为其他Active Directory用户以获取cetain管理功能。我们通过设置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'actionlink)。问题是,一旦你离开了索引页面,一旦克服了'changeuser',即使已经设置了401,actionlink也不会再提示用户登录。

任何指导意见。

2 个答案:

答案 0 :(得分:1)

你可以做到,但确实需要一些技巧。该代码基于对具有“作为不同用户登录”功能的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");
      }
   }
}

答案 1 :(得分:0)

令人惊讶的是,似乎浏览器不支持此功能。我发现这个问题是为了一个朋友去年六月问了类似的事情:

Logging a user out when using HTTP Basic authentication

他链接到另一个问题,最好的答案有点傻:

How to log out user from web site using BASIC authentication?

  

基本身份验证不是为了管理注销而设计的。你可以这样做,但不是完全自动的。

     

您需要做的是让用户点击退出链接,并使用相同的域发送“401 Unauthorized”,并使用与您发送的请求登录的普通401相同的URL文件夹级别。

     

接下来必须指示他们输入错误的凭证,例如。一个空白的用户名和密码,作为回应,您发回“您已成功注销”页面。然后,错误/空白凭证将覆盖先前正确的凭证。