#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;json=%7B"fdml"%3A"HR.Employee as emp%20%7B emp.ID%2C emp.FIRSTNAME%2C 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:
Чтобы решить эту проблему, вам нужно сделать так
- удалите все пользовательские заголовки из вашего web.config
- Добавьте эту ссылку в свой проект web api:
System.Web.Http.Cors
- добавьте следующую строку кода внутри метода Register класса WebApiConfig.
конфигурация.EnableCors();
- Добавьте следующий атрибут в свой контроллер (ы)
[EnableCors(исходные данные: ««, заголовки: ««, методы: «*», SupportsCredentials = true)]
Комментарии:
1. В дополнение к этому, если по какой-то причине у вас нет прямого доступа к
System.Web.Http.Cors
(его не было в моем списке ссылок на сборку в VS2013), вы можете установить его через NuGet сInstall-Package Microsoft.AspNet.WebApi.Cors
помощью . Это позволяет получить все ссылки, чтобы вы могли начать выполнять описанные выше действия.