Ваша проблема не в запросе AJAX, ваша проблема в возврате HTTP 401 Несанкционированного ответа, потому что вы используете проверку подлинности с помощью форм. Этот код ответа сообщает платформе, что он должен перенаправить пользовательский агент на вашу страницу входа с ответом HTTP 302. Вот почему было легко настроить «нормальное» перенаправление запросов - это делается автоматически.
Чтобы ответить на ваш вопрос, у меня была похожая проблема, и в результате я решил не использовать проверку подлинности с помощью форм. Я реализовал пользовательский атрибут авторизации, который обрабатывает оба случая вручную. Я не уверен, что это лучший подход, но он работает. Мне интересно, что другие думают об этом решении или какие есть другие решения.
К счастью, вы все еще можете использовать класс FormsAuthentication
для обработки файлов cookie для вас, но вам нужно удалить конфигурацию аутентификации форм из вашего файла Web.config. Когда пользователь входит в систему, вы используете FormsAuthentication.SetAuthCookie
, чтобы установить cookie (вы, вероятно, уже делаете это). Во-вторых, в своем атрибуте авторизации вы получаете куки-файл из запроса и используете FormsAuthentication.Decrypt
для его расшифровки. Если он существует и действителен, вы устанавливаете пользователя в HttpContext
на основе этого файла cookie, потому что проверка подлинности с помощью форм больше не сделает это за вас. Если это не так, вы либо перенаправляете на страницу входа, либо возвращаете 401, в зависимости от того, является ли это вызовом AJAX или нет.