Заголовок авторизации равен нулю при выполнении запроса jQuery Ajax

#c# #javascript #jquery #asp.net-web-api

#c# #javascript #jquery #asp.net-web-api

Вопрос:

Я просмотрел практически все статьи, которые смог найти, и следовал тому, что было предложено, и каким-то образом при обработке запроса на стороне сервера заголовок авторизации равен нулю.

Серверная часть представляет собой ASP.Net Веб-API MVC и я внедрили фильтр для проверки подлинности. Я попробовал это с помощью Postman и настроил заголовок авторизации, и я убедился, что внутренний код работает.

Однако, похоже, я не могу заставить его работать с помощью вызова ajax в jQuery.

Вот запрос jQuery Ajax:

 //do an ajax call to the api
    $.ajax({
        url: "http://localhost:55602/api/EvaluateTableExpression?callback=?",
        type: "GET",
        data: "json="   escape(JSON.stringify({
            "fdml": "HR.Employee as emp { emp.ID, emp.FIRSTNAME, emp.PRSNAME }"
        })),
        dataType: "jsonp",
        beforeSend: function(request) {
            request.setRequestHeader("Authorization", "Basic "   btoa("master:servant"));
        },
        success: function(data, status) {

            console.log(data);

            if (!data.ErrorsOccurred) {
                var header = data.Value.Header.Columns;
                var records = processRecords(header, data.Value.Rows.Rows);
                renderGrid(header, records, $("#employeeGrid"));
            }
        },
        error: function(xhr, textStatus, errorThrown){
            console.log(errorThrown);
        }
    });
 

И ниже приведен фрагмент кода, который обрабатывает запрос…

 public override void OnAuthorization(HttpActionContext actionContext)
    {
        // in case the user is authorized using forms authentication
        // check the header for basic authentication
        if (Thread.CurrentPrincipal.Identity.IsAuthenticated) return;

        var authHeader = actionContext.Request.Headers.Authorization;
        if (authHeader != null)
        {
            if (authHeader.Scheme.Equals("basic", StringComparison.OrdinalIgnoreCase) amp;amp;
                !String.IsNullOrWhiteSpace(authHeader.Parameter))

                if (AuthenticateUser(authHeader)) return;
        }

        HandleUnauthorizedRequest(actionContext);
    }
 

Когда я проверяю ActionContext.Request.Заголовок, я вижу авторизацию, но его значение равно нулю.

Что я здесь делаю не так? Заранее спасибо.

РЕДАКТИРОВАТЬ: я также включаю некоторые настройки в файл web.config, которые могут помочь выяснить причину проблемы.

 <httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Request-Headers" value="Authorization, Content-Type"/>
    <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization" />
    <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" />
  </customHeaders>
</httpProtocol>

<authentication mode="Forms" />
 

РЕДАКТИРОВАТЬ: ниже приведен необработанный Http-запрос

 GET /api/EvaluateTableExpression?callback=jQuery21109280835636891425_1403905133542amp;j‌​son=%7B"fdml"%3A"HR.Employee as emp%20%7B emp.ID%2C emp.FIRSTNAME%2‌​C emp.PRSNAME%20%7D"}amp;_=1403905133544 
HTTP/1.1 Host: localhost:55602 
Connection: keep-alive 
Accept: / User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Referer: localhost/FDMWeb Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8
 

РЕДАКТИРОВАТЬ: похоже, что это как-то связано с выполнением запроса с перекрестным источником. Когда я комментирую атрибут DataType: «jsonp» в вызове ajax, теперь я вижу, что заголовок авторизации устанавливается. Теперь проблема в том, как мне установить заголовок при ожидании результата jsonp или выполнении CORS?

Комментарии:

1. Есть ли причина, по которой вы не просто используете jQuery.Ajax({ Headers: {} }); ?

2. @ErikPhilips… Я тоже пробовал это. Нет сигары: (

3. Можете ли вы опубликовать свой необработанный http-запрос?

4. ПОЛУЧИТЬ /api/EvaluateTableExpression?callback=jQuery21109280835636891425_1403905133542amp;json={«fdml»:»HR.Employee as emp { emp.ID, emp.FIRSTNAME, emp.PRSNAME }»}amp;_=1403905133544HTTP / 1.1 Хост: localhost:55602 Соединение: keep-alive Принять: / User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/ 35.0.1916.153 Safari /537.36 Ссылка: localhost / FDMWeb Принять-Кодирование: gzip, deflate, sdch Принять-Язык: en-US, en; q = 0.8

5. Я не уверен, что это имело бы большой смысл. Извините за форматирование none

Ответ №1:

Чтобы решить эту проблему, вам нужно сделать так

  1. удалите все пользовательские заголовки из вашего web.config
  2. Добавьте эту ссылку в свой проект web api:

    System.Web.Http.Cors

  3. добавьте следующую строку кода внутри метода Register класса WebApiConfig.

    конфигурация.EnableCors();

  4. Добавьте следующий атрибут в свой контроллер (ы)

    [EnableCors(исходные данные: ««, заголовки: ««, методы: «*», SupportsCredentials = true)]

Комментарии:

1. В дополнение к этому, если по какой-то причине у вас нет прямого доступа к System.Web.Http.Cors (его не было в моем списке ссылок на сборку в VS2013), вы можете установить его через NuGet с Install-Package Microsoft.AspNet.WebApi.Cors помощью . Это позволяет получить все ссылки, чтобы вы могли начать выполнять описанные выше действия.