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.
Vous devez vous connecter pour publier un commentaire.
Trouvé!
Le principal problème est dans cette ligne:
J'ai remarqué que par le passage de AddMvcCore() pour AddMvc(), l'autorisation soudainement commencé à travailler! Après avoir creuser par le biais de l'ASP.NET le code source, pour voir ce que
AddMvc()
n', j'ai réalisé que j'ai besoin d'un deuxième appel, àIMvcBuilder.AddAuthorization()
.AddMvcCore
). L'appel àAddAuthorization()
ajoute laAuthorizationApplicationModelProvider
qui semble pour Autoriser/AllowAnonymous sur les contrôleurs et ajoute les politiques appropriées.AddDataAnnotations
trop, si vous les utilisez pour la validation de la demande!Vous êtes également à l'aide de l'authentification de l'identité et il contient de l'authentification par cookie implicitement. Probablement vous vous êtes connecté avec l'identité régime et il a provoqué la réussite de l'authentification.
Supprimer l'authentification de l'identité, si elle n'est pas obligatoire(si vous ne souhaitez que jwt d'authentification), de spécifier
Bearer
régime pourAuthorize
attribut comme ci-dessous:ActiveAuthenticationShemes
bien pour les deux, en vain.Pour ceux qui ont même essayé de les aperçus des réponses et ne pas obtenir le problème résolu, en dessous, il est comment le problème a été résolu dans mon cas.