2016-01-25 2 views
2

У меня возникла проблема с получением соответствующего заголовка Access-Control-Allow-Origin с сервера, когда у меня есть и JWT Bearer Authentication, и CORS включены в одной службе. Когда я удаляю UseJwtBearerAuthentication из конфигурации, все работает.Заголовки ядра Asp.net, JWT и CORS

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddCors(options => 
     { 
      options.AddPolicy("AllowAllOrigins", builder => 
      { 
       builder.AllowAnyOrigin(); 
       builder.AllowAnyHeader(); 
       builder.AllowAnyMethod(); 
       builder.AllowCredentials(); 
      }); 
     }); 

     services.AddMvc(); 
    } 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     app.UseJwtBearerAuthentication(options => 
     { 
      options.AutomaticAuthenticate = true; 
      options.RequireHttpsMetadata = false; 
      options.Audience = "c2cf422a-a432-2038-b183-cda64e16239e"; 
      options.Authority = "domain.com"; 
     }); 

     app.UseCors("AllowAllOrigins"); 

     app.UseIISPlatformHandler(); 

     app.UseMvc(); 
    } 

Я попытался изменить порядок настройки, но ничего не работает. Я также попытался добавить [EnableCors («AllowAllOrigins»)] к контроллеру, который я звоню.

Я изменил порядок конфигурации на основе рекомендации в комментариях и определили свойство вызывает вопрос:

app.UseIISPlatformHandler(); 

     app.UseCors("AllowAllOrigins"); 

     app.UseJwtBearerAuthentication(options => 
     { 
      options.AutomaticAuthenticate = true; 
      options.RequireHttpsMetadata = false; 
      options.Audience = "c8cf662a-ac73-4050-b285-cda90e22992e"; 
      options.Authority = "iwdwk.com"; 
     }); 

     app.UseMvc(); 

В приведенном выше коде, линия ниже, кажется, вызывает вопрос:

options.AutomaticAuthenticate = true; 

К сожалению, мне нужно включить это, чтобы я мог передавать токен JWT для авторизации ... Если не существует другого способа сделать это?

+0

Хммм. Мы на 100% уверены, что это не просто проблема с заказом? Я считаю, что правильным порядком должен быть материал для ведения журнала, затем «UseIISPlatformHandler», затем «UseCors», затем «UseJwtBearerAuthentication» и, наконец, «UseMvc». Можете ли вы попробовать попробовать? –

+0

Не уверен ... Я чувствую, что пробовал все комбо, но я не систематически проходил через них. Я дам ваше предложение попробовать, когда я приеду на работу этим утром. –

+0

По-прежнему нет ... Я обновляю вопрос, потому что обнаружил свойство, вызывающее проблему. –

ответ

1

Я думаю, что вызов OPTIONS из вашего браузера отклоняется аутентификацией, поскольку они могут не содержать токен-носитель. Я не уверен, но должен быть способ пропустить аутентификацию для вызова OPTIONS при вызове функции UseJwtBearerAuthentication. Если вы хотите подтвердить это до этого, попробуйте называть свою конечную точку у почтальона, поскольку он пропускает вызов OPTIONS и видит, получили ли вы заголовки контроля доступа для фактического вызова GET/POST

0

Если сервер выбрасывает и исключает, они очищают заголовки и вы увидите ошибку CORS. То, как я привык видеть то, что на самом деле происходит, это сначала получить Bearer Token из одного из моих неудачных запросов с помощью инструментов Chrome dev.

Chrome Dev Tools

Далее я скопировать этот маркер и вставить в Постман в качестве значения для заголовка авторизации в запросе. Когда я это сделал, я, наконец, получил эту замечательную страницу для разработчиков, которая рассказала мне, что я делаю неправильно. Это было то, что я использовал ClientId GUID Azure AD выдает вместо App URI.

Postman

Так что, если вы используете Azure AD, то ваши варианты JWT должны выглядеть следующим образом:

app.UseJwtBearerAuthentication(options => 
    { 
     options.AutomaticAuthenticate = true; 
     options.AutomaticChallenge = true; 
     options.Authority = "https://login.microsoftonline.com/yourtenant.onmicrosoft.com" 
     options.Audience = "https://yourtenant.onmicrosoft.com/AppURI" 
    }); 
0

Реализовать этот вопрос старый, но это, вероятно, связано с тем, что вы выполняете проверку подлинности через CORS с AllowCredentials = true и AllowAnyOrigin = true. Это запрещено. Попробуйте указать конкретное происхождение.

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