ASP.NET Core Autoriser attribut ne fonctionne pas avec JWT

Je veux mettre en œuvre JWT base de la sécurité dans ASP.Net de Base. Tout ce que je veux faire, pour l'instant, c'est de lire porteur de jetons dans la Authorization en-tête, et de les valider par rapport à mes critères. Je n'ai pas besoin (et ne veux pas) pour inclure ASP.Net l'Identité. En fait, j'essaie d'éviter d'utiliser autant de choses qui MVC ajoute que possible, à moins que j'ai vraiment besoin d'eux.

J'ai créé un minimum de projet, qui illustre le problème. Pour voir le code d'origine, il suffit de regarder à travers l'historique des modifications. Je m'attendais à ce échantillon de rejeter toutes les demandes d' /api/icônes, à moins qu'ils fournissent la Authorization HTTP en-tête correspondant au porteur du jeton. L'échantillon , permet en fait à toutes les demandes.

De démarrage.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?}"));
}
}
}

Contrôleurs/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");
}
}
}
  • Pouvez-vous indiquer la méthode et les classes où vous avez appliqué l'autoriser attribut?
  • Où est votre JWT jeton middleware? Votre service est bien la génération d'un JWT par le biais de l' /jeton point de fin ou quelque chose de similaire?
  • À ce stade, je ne m'inquiète pas à propos de la création de jetons, je viens de soins de rejeter tout ce qui n'est pas un jeton dans les en-têtes.
  • Ce que vous avez maintenant est assez identique à ce que j'ai, sauf que j'ai ValidateIssuer = true et ValidateAudience = vrai, mais je ne pense pas que ceux qui sont requis. Je n'ai pas de services.AddAuthentication(); soit.
  • Ouais, j'ai juste essayé de les ajouter dans et pas de différence. Il doit y avoir quelque chose qui m'échappe...
  • J'ai essayé de mon service avec mon jeton de middleware et il obtient un 401 avec aucun jeton. Aussi essayé avec application.UseAuthentication().
  • Mine retourne: { "date": "Thu, 17 Nov 2016 19:37:11 GMT", "www-authenticate": "au Porteur", "x-sourcefiles": "<suppression de l'>", "serveur": "Crécerelle", "x-powered-by": "ASP.NET", "content-length": "0", "content-type": null }
  • Une chose que j'ai remarqué c'est différent, c'est que vous n'avez pas à décorer votre méthode Get() avec [HttpGet]. Il POURRAIT avoir quelque chose à faire avec ce qu'il vous traiter de la méthode différemment sans l'attribut... vaut la peine d'essayer :).
  • L'ajout de [HttpGet] avait pas de résultat. Par ailleurs, j'ai basé mon projet l'exemple de programme sur leur site web, mais il n'utilise pas de contrôleurs ou de l'Autoriser de l'attribut.