2016-11-17 3 views
5

Я хочу реализовать безопасность на основе JWT в ASP.Net Core. На данный момент все, что я хочу сделать, это прочитать токены на предъявителя в заголовке Authorization и проверить их на соответствие моим критериям. Мне не нужно (и не хочу) включать ASP.Net Identity. На самом деле, я стараюсь избегать использования многих вещей, которые MVC добавляет, насколько это возможно, если я им действительно не нужен.Атрибут Authorize Core Authorize не работает с JWT

Я создал минимальный проект, который демонстрирует проблему. Чтобы увидеть исходный код, просто просмотрите историю изменений. Я ожидал, что этот образец отклонит все запросы для/api/icons, если они не содержат HTTP-заголовок Authorization с соответствующим маркером-носителем. Образец фактически разрешает все запросы.

Startup.cs

using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Hosting; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Logging; 
using Microsoft.Extensions.Configuration; 
using Microsoft.AspNetCore.Routing; 
using Microsoft.IdentityModel.Tokens; 
using System.Text; 
using System; 
using Newtonsoft.Json.Serialization; 

namespace JWTSecurity 
{ 
    public class Startup 
    { 
     public IConfigurationRoot Configuration { get; set; } 

     public Startup(IHostingEnvironment env) 
     { 
      IConfigurationBuilder builder = new ConfigurationBuilder().SetBasePath(env.ContentRootPath); 
      Configuration = builder.Build(); 
     } 

     public void ConfigureServices(IServiceCollection services) 
     { 
      services.AddOptions(); 
      services.AddAuthentication(); 
      services.AddMvcCore().AddJsonFormatters(options => options.ContractResolver = new CamelCasePropertyNamesContractResolver()); 
     } 

     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
     { 
      loggerFactory.AddConsole(); 
      app.UseJwtBearerAuthentication(new JwtBearerOptions 
      { 
       AutomaticAuthenticate = true, 
       AutomaticChallenge = true, 
       TokenValidationParameters = new TokenValidationParameters 
       { 
        ValidateIssuerSigningKey = true, 
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("supersecretkey")), 
        ValidateIssuer = false, 
        ValidateAudience = false, 
        ValidateLifetime = true, 
        ClockSkew = TimeSpan.Zero 
       } 
      }); 
      app.UseMvc(routes => routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}")); 
     } 
    } 
} 

Контроллеры/IconsController.cs

using Microsoft.AspNetCore.Authorization; 
using Microsoft.AspNetCore.Mvc; 

namespace JWTSecurity.Controllers 
{ 
    [Route("api/[controller]")] 
    public class IconsController : Controller 
    { 
     [Authorize] 
     public IActionResult Get() 
     { 
      return Ok("Some content"); 
     } 
    } 
} 
+0

Могут ли вы показать метод и классы, где применяется атрибут авторизовать? –

+0

Где ваше промежуточное программное обеспечение токена JWT? Ваша служба правильно генерирует JWT через конечную точку/токен или что-то подобное? – SledgeHammer

+0

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

ответ

21

Нашел!

Основная проблема заключается в этой строке:

services.AddMvcCore().AddJsonFormatters(options => options.ContractResolver = new CamelCasePropertyNamesContractResolver()); 

Я заметил, что при переходе от AddMvcCore() в AddMvc(), разрешение внезапно начал работать! После копания через the ASP.NET source code, чтобы увидеть, что делает AddMvc(), я понял, что мне нужен второй звонок, до IMvcBuilder.AddAuthorization().

services.AddMvcCore() 
    .AddAuthorization() // Note - this is on the IMvcBuilder, not the service collection 
    .AddJsonFormatters(options => options.ContractResolver = new CamelCasePropertyNamesContractResolver()); 
+1

Это тоже меня поймало (так как я использую 'AddMvcCore'). Вызов 'AddAuthorization()' добавляет ['AuthorizationApplicationModelProvider'] (https://github.com/aspnet/Mvc/blob/760c8f38678118734399c58c2dac981ea6e47046/src/Microsoft.AspNetCore.Mvc.Core/Internal/AuthorizationApplicationModelProvider.cs), который выглядит для Authorize/AllowAnonymous на контроллерах и добавляет соответствующие политики. –

+0

Не забудьте также 'AddDataAnnotations', если вы используете их для проверки запроса! –

6

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

Remove аутентификации личности, если это не требуется (если вы хотите только JWT аутентификации), в противном случае укажите Bearer схему Authorize атрибута, как показано ниже:

[Authorize(ActiveAuthenticationSchemes = "Bearer")] 
+0

Я попробую это, когда вернусь чтобы работать завтра, я надеюсь, что вы правы. В этой заметке причина, по которой я использую идентификацию, заключается в том, чтобы скрыть/абстрагировать хэширование пароля. Какой альтернативой вы предложили бы? –

+0

Идентификация рекомендуется. Если вам нужно, Насколько я понимаю ou хочет использовать идентификатор и jwt необязательно. В этом случае вы должны указать схему аутентификации для ограничения. Например, вы должны использовать схему переноса, если вам нужна только аутентификация jwt. –

+0

Я пробовал оба варианта (только Identity и только JWT), а также пытался использовать свойство «ActiveAuthenticationShemes» для обоих, но безрезультатно. –

-1

Добавить схемы аутентификации с атрибутом Authorize для знаменосца с Json Web Токеном [Авторизоваться (AuthenticationSchemes = «Носитель»)]

+0

Это дубликат ответа Адем Каглин выше. Если вы прочтете комментарии по этому вопросу или посмотрите на тот факт, что этот вопрос имеет принятый ответ, вы бы заметили, что этот ответ не решил проблему. –

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