Вопрос по asp.net-mvc, asp.net-mvc-5, asp.net, http-status-codes, c# – HttpStatusCodeResult (401) возвращает «302 найдено»
Используя ASP.NET MVC 5, я хотел бы вернуть соответствующий код состояния HTTP для различных сценариев (401 для пользователя не аутентифицирован, 403 для пользователя нет прав на какой-либо ресурс и т. Д.), Чем обрабатывать их в jQuery.
Но проблема в том, что когда я пытаюсь вернуть 401, он всегда возвращается "302: найдено ", Какова хитрость для пользовательского кода состояния, и почему это не 'т работаешь?
public ActionResult My()
{
if (User.Identity.IsAuthenticated == false)
{
return new HttpStatusCodeResult(401, "User is not authenticated.");
// Returns "302: Found"
}
// ... other code ...
}
РЕДАКТИРОВАТЬ 1: Интересный бит:
Если я заменю 401 на 404, как это:
return new HttpNotFoundResult("User is not authenticated.");
Тогда это действительно дает 404, и jQuery может поймать проблему. Однако это 'Это не элегантное решение, так как код ошибки другой.
РЕДАКТИРОВАТЬ 2: 302 не подходит для меня, так как результат будет использован вjQuery.get().fail()
, но 302 выигралт тригерfail()
В MVC работает аутентификация, когда вы неt залогинился и попытался получить доступ к защищенной странице, он выдает исключение 401. MVC затем ловит это исключение и перенаправляет пользователя на страницу входа (это 302, который вы видите)
Я полагаю, тамНесколько вещей, которые вы можете сделать, чтобы это исправить:
Проигнорируйте это, это, вероятно, поведение, которое вы хотите в любом случаеОтключить перенаправление страницы входа в систему (Фил Хаак имеет хорошую статью по этому вопросу здесь:http://haacked.com/archive/2011/10/04/prevent-forms-authentication-login-page-redirect-when-you-donrsquot-want.aspx)РЕДАКТИРОВАТЬ
Согласно вашим комментариям, следующий код превратит все перенаправления в 401 при запросе через ajax. Это один из подходов для избежания перечисленной проблемы.
public class MvcApplication : HttpApplication {
protected void Application_EndRequest() {
var context = new HttpContextWrapper(Context);
// If we're an ajax request, and doing a 302, then we actually need to do a 401
if (Context.Response.StatusCode == 302 && context.Request.IsAjaxRequest()) {
Context.Response.Clear();
Context.Response.StatusCode = 401;
}
}
}
HttpResponse.SuppressFormsAuthenticationRedirect
jQuery.get
мог бы распознать это.
HttpResponse.SuppressFormsAuthenticationRedirect
свойство из моего метода, который возвращаетActionResult
, Однако я нашел следующее среди взломанных комментариев:довольно удобно с небольшим дополнением:gist.github.com/1264267 Если вы включите этот фрагмент кода, я буду рад принять ваш ответ. Еще раз спасибо
Response.SuppressFormsAuthenticationRedirect = true
если вы нацелены на .net 4.5