我有一个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也不会再提示用户登录。
任何指导意见。
答案 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文件夹级别。
接下来必须指示他们输入错误的凭证,例如。一个空白的用户名和密码,作为回应,您发回“您已成功注销”页面。然后,错误/空白凭证将覆盖先前正确的凭证。