401 Неавторизованная ошибка при выполнении ajax-вызова конечной точки веб-API asp.net с включенной аутентификацией окна

Я создал простое веб-приложение API ASP.NET. Я включил CORS с помощью пакета Microsoft.AspNet.WebApi.Cors.

Вот так выглядит мой контроллер:

public class UserController : ApiController
    {
        [Route("user/name")]
        [HttpGet]
        public HttpResponseMessage GetUserName()
        {
            dynamic data = new ExpandoObject();
            data.user = HttpContext.Current.User.Identity.Name;
            var response = JsonConvert.SerializeObject(data);

            var msg = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(response)
            };

            return msg;
        }
    }

Я возвращаю только идентификатор пользователя из этого контроллера.

Я разместил приложение на IIS 8.5. Я отключил анонимную аутентификацию и включил аутентификацию Windows.

Если я использую клиент отдыха или получаю прямой доступ к конечной точке, вводя URL-адрес в браузере, я получаю имя пользователя. Если я использую REST-клиент, я получаю ответ

но если я сделаю вызов AJAX с помощью jquery, я получаю код состояния 401.

$.ajax({url: 'http://serverName:8899/user/name',   method: 'GET' , 
success:function(res){
alert('hello');
}}) ;

Вышеупомянутый вызов работает в IE, только Chrome выдает ошибку 401

Как мне исправить эту ошибку. Я включаю проверку подлинности Windows с помощью IIS и вообще не менял свой web.config. Если это проблема аутентификации, почему я могу получать данные, когда использую клиент отдыха?


person SharpCoder    schedule 10.04.2017    source источник
comment
Возможный дубликат Как передать аутентификацию Windows в веб-сервис с помощью jQuery?   -  person Erik Philips    schedule 10.04.2017


Ответы (1)


Убедитесь, что вы также зарегистрировали поддержку CORS либо глобально, либо в контроллере, либо в действии.

Global - в файл WebApiConfig.cs из папки App_Start добавьте:

public static void Register(HttpConfiguration config) {

// New code: var cors = new EnableCorsAttribute( origins: "*", headers: "*", methods: "*"); config.EnableCors(cors);

// Other configurations

}

Контроллер или Действие. При желании / необходимости разместить поддержку на этих уровнях (это перезапишет глобальные настройки - Действие> Контроллер> Конфигурация). Над подписью контроллера или действия:

[EnableCors(origins: "http://localhost:[port #]", headers: "*", methods: "*")]

Примечание. * - это "подстановочные знаки", возможно, потребуется разместить домен, выполняющий запрос ex: (http://localhost:[ номер порта])

То, что очень легко пропустить / забыть ...

В обозревателе решений щелкните правой кнопкой мыши api-project. В окне свойств установите для параметра "Анонимная аутентификация" значение Включено !!!

person Wes    schedule 16.05.2017