Вопрос по asp.net-mvc, asp.net-mvc-5, asp.net, http-status-codes, c# – HttpStatusCodeResult (401) возвращает «302 найдено»

10

Используя 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()

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

Ваш Ответ

1   ответ
18

В 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 Adam Szabo
Редирект выигралне бывает, как контроллерметод вызывается через AJAX, что 'почему мне нужно что-то кроме 302, такjQuery.get мог бы распознать это. Adam Szabo
проверил статью, этонемного грязно Я'я использую .NET 4.5.1 и проверил решение 4.5, но у меня нетне нашел способ манипулироватьHttpResponse.SuppressFormsAuthenticationRedirect свойство из моего метода, который возвращаетActionResult, Однако я нашел следующее среди взломанных комментариев:довольно удобно с небольшим дополнением:gist.github.com/1264267  Если вы включите этот фрагмент кода, я буду рад принять ваш ответ. Еще раз спасибо Adam Szabo
@ user2270404 это простоResponse.SuppressFormsAuthenticationRedirect = true если вы нацелены на .net 4.5 Luke McGregor

Похожие вопросы