2016-02-19 2 views
0

Я сохраняю токен в заголовке запроса с помощью ajax и отправляю его в Rest web api. Это мой запрос, отправленный на Web API:Невозможно прочитать значение заголовка запроса в остальном web api

var xhr = new XMLHttpRequest(); 
      $.ajax({ 
       url: 'http://localhost:32253/api/UserDetail/Authenticate', 
       headers: { 
        "Authorization-Token": res, 
        "X-HTTP-Method-Override": "GET" 
       }, 
       type: 'GET', 
       async: false, 
       contentType: "application/json", 
       dataType: 'json', 
       success: function (data) { 
        alert("Success from success callback!"); 
        // ShowData(data);      
        $('#RId').text(data.RoleId); 
        $('#RDesc').text(data.RoleDescription); 
        $('#RName').text(data.RoleName); 
       }, 
       error: function (xhr, status) { 
        alert(status); 
       } 
       //complete: function (data) { 
       // alert("Success!from complete function"); 
       // } 
      }); 

На стороне сервера (остальной Web API), я пытаюсь прочитать заголовок

if (Request.Headers.Contains("Authorization-Token")) 
      { 
       var token = Request.Headers.GetValues("Authorization-Token").First(); 
} 

Но запрос не содержит заголовок " Авторизация-Токен». Я вижу имя заголовка в заголовках Access-Control-request-Headers. Я не знаю, как читать его ценность. Кто-нибудь может мне помочь. Я включил CORS слишком

UPDATE Теперь я передаю маркер, используя стандартный Authorization заголовок запроса объекта

$.ajax({ 
       url: 'http://localhost:32253/api/UserDetail/Authenticate', 
       beforeSend: function (xhr) { 
        xhr.setRequestHeader("Authorization", "Basic " + res); 
       }, 
       type: 'GET', 
       async: false, 
       contentType: "application/json", 
       dataType: 'json', 
       authorization: res, 
       success: function (data) { 
        alert("Success from success callback!"); 
        // ShowData(data);      
        $('#RId').text(data.RoleId); 
        $('#RDesc').text(data.RoleDescription); 
        $('#RName').text(data.RoleName); 
       }, 
       error: function (xhr, status) { 
        alert(status); 
       } 
       //complete: function (data) { 
       // alert("Success!from complete function"); 
       // } 
      }); 

, но я не могу найти его в заголовки запросов. Смотрите изображение для более подробной информации Request header

ЗАПРОС LOG Это запрос, полученный на стороне сервера

OPTIONS /api/UserDetail/Authenticate HTTP/1.1 
Connection: keep-alive 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding: gzip, deflate 
Accept-Language: en-GB,en;q=0.5 
Host: localhost:32253 
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0 
Access-Control-Request-Method: GET 
Access-Control-Request-Headers: authorization-token,content-type 
Origin: http://localhost:14576 

ответ

0

Спасибо Даниилу за ваше предложение. Вопрос был, как вы сказали с помощью запроса OPTIONS. Я установил заголовки Access-Control-Allow-Headers в ответе на запрос OPTIONS. Я добавил следующее в global.asax.Кс REST Web API

protected void Application_BeginRequest(object sender, EventArgs e) 
     { 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:14576"); 
      if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
      { 
       HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); 

       HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Authorization-Token, X-HTTP-Method-Override"); 
       HttpContext.Current.Response.End(); 
      } 
     } 

Клиент код запроса со стороны выглядит следующим образом:

var xhr = new XMLHttpRequest(); 
      $.ajax({ 
       url: 'http://localhost:32253/api/UserDetail/Authenticate', 
       beforeSend: function (xhr) { 
        xhr.setRequestHeader('X-Authorization-Token', res); 
        xhr.setRequestHeader('X-HTTP-Method-Override', "GET"); 
       }, 
       type: 'GET', 
       async: false, 
       dataType: 'json', 
       success: function (data) { 
        alert("Success from success callback!"); 
       }, 
       error: function (xhr, status) { 
        alert(status); 
       } 
      }); 

Rest веб-код апи для чтения заголовка:

if (Request.Headers.Contains("X-Authorization-Token")) 
      { 

       var token = Request.Headers.GetValues("X-Authorization-Token").First(); 
} 

Это работает просто отлично.

Спасибо, ребята, за ваше время и предложения :)

+0

Рад, что вы его нашли! Для этого вам понадобится пакет nuget: [Microsoft.AspNet.WebApi.Cors] (https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Cors/), то в вашем WebApiConfig вы просто добавляете это 'config.EnableCors (новый EnableCorsAttribute (" domain.com "," * "," * "));' Есть довольно хорошая статья от MS [здесь] (http://www.asp.net/web-api/ Обзор/безопасность/включения-кросс-Origin-запросы-в-веб-API). – ManOVision

+0

Я сначала попытался с CORS, но это не помогло. Я включил CORS в webapiconfig и добавил enablecors на свой метод get. Но это не помогло. Наконец, я удалил CORS и попробовал вышеупомянутое решение, и он наконец-то сработал. Я не знаю, почему CORS не работал должным образом –

0

Попробуйте придерживаться стандартных имен заголовков. Возможно, что значение не проходит мимо всех сетевых перелетов. Используйте заголовок авторизации со схемой несущей, так как это стандартно, а затем в C# это стандартное свойство.

"Authorization" : "Bearer sometoken" 

var header = this.Request.Headers.Authorization; 
if(header != null && header.Scheme == "Bearer") { /* do something with header.Value */ } 

Если вы должны использовать нестандартный заголовок, префикс его с X, например:

"X-Authorization-Token" : "sometoken" 

Любые прокси или маршрутизаторы должны позволить Х- заголовки пройти без каких-либо проблем.

UPDATE

настройки заголовков с помощью параметра beforeSend Try:

beforeSend: function (xhr) { 
    xhr.setRequestHeader('Authorization-Token', res); 
}, 
+0

Я пробовал оба, но никто не работал. Incase of Request.Headers.Authorization, значение авторизации равно null. Вставка префикса, я могу видеть имя заголовка в заголовках Access-Control-request-Headers, но Request.Headers выдает исключение «Данный заголовок не найден» –

+0

Работает ли он при работе под локальным хостом? Может быть, мы можем изолировать его до проблемы CORS. – ManOVision

+0

Я заметил, что вы используете заголовок X-HTTP-Method-Override. Дважды проверьте код обработчиков, чтобы убедиться, что он не зачищает заголовки. Вы можете поместить точку останова в методе Application_BeginRequest, чтобы увидеть, есть ли заголовок в начале запроса, и если он есть, но не на вашем контроллере, тогда у вас есть что-то перехватывающее его. – ManOVision

0

Попробуйте следующие:

var xhr = new XMLHttpRequest(); 
     $.ajax({ 
      url: 'http://localhost:32253/api/UserDetail/Authenticate', 
      beforeSend: function (xhr) { 
       xhr.setRequestHeader('Authorization-Token', res); 
       xhr.setRequestHeader('X-HTTP-Method-Override', "GET"); 
      }, 
      type: 'GET', 
      async: false, 
      contentType: "application/json", 
      dataType: 'json', 
      success: function (data) { 
       alert("Success from success callback!"); 
       // ShowData(data);      
       $('#RId').text(data.RoleId); 
       $('#RDesc').text(data.RoleDescription); 
       $('#RName').text(data.RoleName); 
      }, 
      error: function (xhr, status) { 
       alert(status); 
      } 
      //complete: function (data) { 
      // alert("Success!from complete function"); 
      // } 
     }); 

UPDATE: Захваченные сети и в состоянии найти маркеры в запросе заголовки. Смотрите изображение для более подробной информации

Request

ничего без полного кода не могу сказать.

+0

Я тоже это пробовал .. не работает –

+0

Я пробовал это с веб-кодом API ... его рабочий .. string token = Request.Headers.FirstOrDefault (x => x.Key.ToLower() == "авторизация-токен"). Value.FirstOrDefault(); Iam, получающий значение токена –

+0

Я добавил изображение запроса, сделанного на веб-сайт api .. вы можете заглянуть в него? Я не могу найти заголовок, который я прохожу –

Смежные вопросы