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()

 Daniel A. White10 сент. 2013 г., 22:59
Вы используете аутентификацию форм?
 Adam Szabo10 сент. 2013 г., 23:31
мртиг: яЯ видел это раньше, но нене поможет, как говоритсяРешается с помощью IIS Express. Я использую IIS Express, но у меня все еще есть проблема.
 mrtig10 сент. 2013 г., 23:06
Взгляни на это:stackoverflow.com/questions/10348111/...
 Adam Szabo10 сент. 2013 г., 23:32
Даниэль А. Уайт: Яиспользуя встроенную аутентификацию по умолчанию в шаблоне ASP.NET MVC5 под названием "Индивидуальные учетные записи пользователей "

Ответы на вопрос(1)

Решение Вопроса

В 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;
        }
    }
}
 Adam Szabo10 сент. 2013 г., 23:28
Редирект выигралне бывает, как контроллерметод вызывается через AJAX, что 'почему мне нужно что-то кроме 302, такjQuery.get мог бы распознать это.
 Adam Szabo10 сент. 2013 г., 23:56
проверил статью, этонемного грязно Я'я использую .NET 4.5.1 и проверил решение 4.5, но у меня нетне нашел способ манипулироватьHttpResponse.SuppressFormsAuthenticationRedirect свойство из моего метода, который возвращаетActionResult, Однако я нашел следующее среди взломанных комментариев:довольно удобно с небольшим дополнением:gist.github.com/1264267  Если вы включите этот фрагмент кода, я буду рад принять ваш ответ. Еще раз спасибо
 Luke McGregor11 сент. 2013 г., 00:02
@ user2270404 рад помочь :)
 Adam Szabo11 сент. 2013 г., 00:17
Спасибо. тем не мениеSuppressFormsAuthenticationRedirect кажется, не работает (по крайней мере, для AJAX) для меня, поэтому ябуду придерживатьсяApplication_EndRequest()
 Adam Szabo11 сент. 2013 г., 00:02
Или ты знаешь, где я могу установить?HttpResponse.SuppressFormsAuthenticationRedirect
 Luke McGregor11 сент. 2013 г., 00:11
@ user2270404 это простоResponse.SuppressFormsAuthenticationRedirect = true если вы нацелены на .net 4.5
 Luke McGregor10 сент. 2013 г., 23:31
@ user2270404 взгляните на код Фака Хака. Он создает модуль HTTP, чтобы решить эту проблему и в любом случае вернуть 401 (точно для случая ajax). Это немного беспорядочно, но это должно решить вашу проблему. Согласно статье, есть и лучший способ обойти это, если вы используете .NET 4.5 stuffI '

Ваш ответ на вопрос