Ответ 1
Ahhhh, вы знаете, когда вы не думаете о чем-то какое-то время, и вас поражают внезапным вдохновением... Ну, это случилось прошлой ночью, и я обнаружил, что этот маленький самородок встал на место, чтобы "исправить" сопротивление MVC при перенаправлении AJAX запрашивает, когда аутентификация завершается неудачно...
protected void Application_EndRequest()
{
var context = new HttpContextWrapper(Context);
// MVC retuns a 302 for unauthorized ajax requests so alter to request status to be a 401
if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest() && !context.Request.IsAuthenticated)
{
context.Response.Clear();
context.Response.StatusCode = 401;
}
}
И, неудивительно, context.Request.IsAuthenticated
всегда false, поскольку, как представляется, он получает reset путем перенаправления.
Обновлено, с небольшой помощью блога Бранислава Абаджимаринова по этому вопросу.
protected void Application_EndRequest()
{
var context = new HttpContextWrapper(Context);
// MVC returns a 302 for unauthorized ajax requests so alter to request status to be a 401
if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
{
//Unfortunately the redirect also clears the results of any authentication
//Try to manually authenticate the user...
var authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket != null && !authTicket.Expired)
{
var roles = authTicket.UserData.Split(',');
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles);
}
}
if (!context.Request.IsAuthenticated)
{
context.Response.Clear();
context.Response.StatusCode = 401;
}
}
}
И все работает как ожидалось.
Вопрос только в том, должен ли я удалить этот вопрос?