Angular 5 Web API 2 ошибка CORS при выполнении запросов GET

У меня есть приложение Angular5 и веб-API2 в качестве уровня обслуживания. Я использую аутентификацию на основе токена Identity Framework OAuth Owin. Код CORS работает для запроса генерации токена, но для последующих запросов GET он не работает, и я получаю ошибку 401 Not Authorized.

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

 this._httpHeader = {
        headers: {         
          'Content-Type': 'application/x-www-form-urlencoded'
        }

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

getCurrentUserLogin(): Observable<any> {    
    if (sessionStorage.getItem('AccessToken') == null || sessionStorage.getItem('AccessToken') == 'undefined') {


      let requestOptions = new RequestOptions({ headers: this._httpHeader, withCredentials:  true  }); 
      return this._http.get(this._baseURL + "Authentication", requestOptions)

        .map(res => {
          if (res != null) {
            return res.json();
          }
        })        
        .do(data => console.info('Token: ' + JSON.stringify(data)))
        .catch(this.handleError);

    }

Ниже приведен код CORS в веб-API: Global.asax.cs:

protected void Application_BeginRequest()
        {
            if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
            {
                Response.Headers.Add("Access-Control-Allow-Origin", ConfigurationManager.AppSettings["AllowAccessToDomain"]);                
                Response.Headers.Add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization,headers");
                Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
                Response.Headers.Add("Access-Control-Allow-Credentials", "true");
                Response.Headers.Add("Access-Control-Max-Age", "1728000");
                Response.End();
            }
        }

WebAPIConfig.cs

public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            EnableCorsAttribute cors = new EnableCorsAttribute(ConfigurationManager.AppSettings["AllowAccessToDomain"], "*", "*") { SupportsCredentials = true };
            config.EnableCors(cors);

            config.Formatters.Clear();
            config.Formatters.Add(new JsonMediaTypeFormatter());


            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }

Я могу успешно сгенерировать токен с помощью приведенного выше кода CORS. Но для приведенного ниже вызова службы из Angular он дает ошибку «Не авторизован»:

Заголовок для обычного GET-запроса от Angular:

this._httpHeader = {
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          'Authorization': 'Bearer ' + sessionStorage.getItem('AccessToken')
        }

Обычный сервисный вызов из Angular:

getHomeAccountTemplates(): Observable<HomeAccountTemplate[]> {

      let requestOptions = new RequestOptions({ headers: this._httpHeader, withCredentials: true });
    return this._http.get(this._baseURL + "Account/AccountTemplates", requestOptions)

        .map(res => {          
          if (res != null) {
            return res.json();
          }
        })        
        .catch(this.handleError);
  }

Контроллер веб-API для вышеуказанного вызова службы:

[Authorize]
    public class AccountController : ApiController
    {
private readonly IAccountService _AccntServices;

        #region Constructors

        public AccountController()
        {
            _AccntServices = new AccountService();
        }

        #endregion

        [HttpGet]
        [Route("api/Account/AccountTemplates")]
        public List<HomeAccountTemplate> GetAccountTemplates()
        {
            //int InstanceID = Convert.ToInt32(((ClaimsIdentity)User.Identity).Claims.FirstOrDefault(c => c.Type.Contains("InstanceId")).Value);
            int InstanceID = 1;
            return _AccntServices.GetAccountTemplates(InstanceID);
        }
}

Вышеупомянутый контроллер не обрабатывается, и выполнение останавливается на Global.asax. Я получаю сообщение об ошибке «Не авторизован». Пожалуйста, помогите, как это исправить.

CORS не должен влиять на запросы GET. Похоже, ваш веб-сервер (IIS?) Отклоняет запросы с этим заголовком Authorization. Например, если вы отключите анонимный доступ и включите проверку подлинности Windows в IIS, вы не сможете пройти через токен-носитель.

vasily.sib 15.06.2018 04:47

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

Sormita Chakraborty 15.06.2018 04:51

Когда я столкнулся с этой проблемой, я нашел решение в поиске в Google для чего-то вроде «IIS включить проверку подлинности Windows для одного маршрута» и включить проверку подлинности Windows для одного маршрута приложения ('/ login')

vasily.sib 15.06.2018 05:01

Не могли бы вы предоставить мне ссылку, по которой вы перешли? Как я уже сказал, я еще не развернул приложение, поэтому как мне включить проверку подлинности Windows для одного маршрута в Web Config?

Sormita Chakraborty 15.06.2018 05:04
stackoverflow.com/questions/25511208/… см. Ответ dragon753
vasily.sib 15.06.2018 05:39

Значит, в вашем приложении включена анонимная аутентификация?

Sormita Chakraborty 15.06.2018 05:41

Не авторизован - это не проблема CORS. Вы проверили заголовок запроса в Chrome Dev Tools, чтобы убедиться, что ваши правильные заголовки отправляются с запросом?

Chau Tran 15.06.2018 10:10

Переданные заголовки верны, я даже пытался получить доступ к службе Web Api из Postman, используя тот же заголовок, и это сработало.

Sormita Chakraborty 15.06.2018 11:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
361
0

Другие вопросы по теме