ASP.NET атрибут авторизации ядра не работает с JWT
Я хочу реализовать безопасность на основе JWT в ASP.Net ядро. Все, что я хочу сделать, это прочитать токены на предъявителя в Authorization
заголовок и проверьте их по моим критериям. Мне не нужно (и не хочу) включать ASP.Net личность. На самом деле я стараюсь избегать использования как можно большего количества вещей, которые добавляет MVC, если они мне действительно не нужны.
Я создал минимальный проект, который демонстрирует проблему. Чтобы увидеть исходный код, просто просмотрите редактирование история. Я ожидал, что этот образец отклонит все запросы на/api / icons, если они не предоставят Authorization
HTTP-заголовок с соответствующим токеном носителя. Образец фактически разрешает все запросы.
Автозагрузка.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");
}
}
}
2 ответов
нашли его!
главная проблема в этой строке:
services.AddMvcCore().AddJsonFormatters(options => options.ContractResolver = new CamelCasePropertyNamesContractResolver());
Я заметил, что при переключении с AddMvcCore () на AddMvc () авторизация внезапно начала работать! После копания ASP.NET исходный код, чтобы увидеть, что AddMvc()
делает, я понял, что мне нужен второй звонок, чтобы IMvcBuilder.AddAuthorization()
.
services.AddMvcCore()
.AddAuthorization() // Note - this is on the IMvcBuilder, not the service collection
.AddJsonFormatters(options => options.ContractResolver = new CamelCasePropertyNamesContractResolver());
вы также используете аутентификацию личности, и она содержит аутентификацию cookie неявно. Вероятно, вы вошли в систему со схемой идентификации, и это вызвало успешную аутентификацию.
удалить аутентификацию личности, если она не требуется(если вы хотите только аутентификацию jwt), в противном случае укажите Bearer
схемы Authorize
атрибута, как показано ниже:
[Authorize(ActiveAuthenticationSchemes = "Bearer")]