web-dev-qa-db-fra.com

Authentification JWT simple dans l'API Web ASP.NET Core 1.0

Je cherche le moyen le plus simple de configurer un serveur Web API qui utilise JWT pour l'authentification dans ASP.NET Core (ou ASP.NET 5). Ce projet ( article de blog / github ) fait exactement ce que je recherche, mais il utilise ASP.NET 4.

Je veux juste pouvoir:

  1. configurez un itinéraire de connexion pouvant créer un jeton JWT et le renvoyer dans l'en-tête. J'intègre ceci avec un service RESTful existant qui me dira si le nom d'utilisateur et le mot de passe sont valides. Dans le projet ASP.NET 4, je pense que cela pourrait se faire avec la route suivante https://github.com/stewartm83/Jwt-WebApi/blob/master/src/JwtWebApi/Controllers/AccountController.cs# L24-L54

  2. Intercepter les demandes entrantes sur les itinéraires qui nécessitent une autorisation, déchiffrer et valider le jeton JWT entrant dans l'en-tête et rendre les informations utilisateur contenues dans la charge utile du jeton JWT accessibles pour l'itinéraire. par exemple. quelque chose comme ceci: https://github.com/stewartm83/Jwt-WebApi/blob/master/src/JwtWebApi/App_Start/AuthHandler.cs

Tous les exemples que j'ai vus dans ASP.NET Core sont très complexes et reposent sur une partie ou la totalité de OAuth, IS, OpenIddict et EF, ce que j'aimerais éviter.

Quelqu'un peut-il m'indiquer un exemple de la manière de procéder dans ASP.NET Core ou m'aider à démarrer avec cela?

EDIT: Answer J'ai fini par utiliser cette réponse: https://stackoverflow.com/a/33217340/373655

57
rob

L'option la plus simple que j'ai trouvée jusqu'à présent est OpenIddict . Vous dites que vous voulez éviter Entity Framework et OpenIddict - vous coderez vous-même en réécrivant efficacement des parties d'OpenIddict et ASOS (qu'OpenIddict utilise) pour faire ce qu'ils font de toute façon.

Si vous utilisez OpenIddict, c’est pratiquement toute la configuration dont vous aurez besoin, ci-dessous. C'est très simple. 

Si vous ne voulez pas utiliser EF, c'est possible avec OpenIddict. Je ne sais pas comment mais c'est le bit que vous devrez comprendre.

ConfigureServices:

services.AddIdentity<ApplicationUser, ApplicationRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders()
            .AddOpenIddictCore<Application>(config => config.UseEntityFramework()); // this line is for OpenIddict

Configurer

app.UseOpenIddictCore(builder =>
{
    // tell openiddict you're wanting to use jwt tokens
    builder.Options.UseJwtTokens();
    // NOTE: for dev consumption only! for live, this is not encouraged!
    builder.Options.AllowInsecureHttp = true;
    builder.Options.ApplicationCanDisplayErrors = true;
});

// use jwt bearer authentication
app.UseJwtBearerAuthentication(options =>
{
    options.AutomaticAuthenticate = true;
    options.AutomaticChallenge = true;
    options.RequireHttpsMetadata = false;
    // these urls must match the value sent in the payload posted from the client side during login
    options.Audience = "http://localhost:58292/";
    options.Authority = "http://localhost:58292/";
});

Il existe un ou deux autres éléments mineurs, tels que votre DbContext doit dériver de OpenIddictContext<ApplicationUser, Application, ApplicationRole, string>.

Vous pouvez voir une explication complète (y compris des liens vers le dépôt Github) sur cet article de blog: http://capesean.co.za/blog/asp-net-5-jwt-tokens/

13
Sean

Si tout ce dont vous avez besoin est une authentification auprès d'un fournisseur externe OAuth/OpenID (Google, GitHub, Facebook, compte Microsoft, etc.), aucun outil tiers n'est nécessaire. 

Les fournisseurs d'authentification pour les fournisseurs OAuth et OpenID les plus couramment utilisés sont déjà fournis avec ASP.NET Core dans les packages Microsoft.AspNetCore.Authorization.*. Consultez les exemples fournis dans le référentiel GitHub du référentiel " Security

Si vous devez créer vos propres jetons JWT, vous avez besoin d'un serveur OAuth/OpenID. OpenIddict est un serveur d'autorisation facile à configurer. Pour cela, vous avez besoin d’une forme de base de données, car des fournisseurs externes seront utilisés pour authentifier la personne, mais vous en aurez également besoin pour disposer d’un compte sur votre serveur d’autorisation.

Si vous avez besoin de plus de personnalisation et de contrôle du flux, vous devez utiliser ASOS ou IdentityServer4 (actuellement uniquement pris en charge par ASP.NET Core lorsque vous travaillez avec .NET Framework ou Mono complet. Le runtime Core n'est pas encore pris en charge à ma connaissance. . 

Il existe également un forum Gitter pour OpenIddict à https://gitter.im/openiddict/core et https://gitter.im/aspnet-contrib/AspNet.Security.OpenIdConnect.Server pour ASOS .

9
Tseng

Il existe un exemple complet pour ASP.NET Core + JWT Auth + SQL Server + Swagger: https://github.com/wilsonwu/netcoreauth

J'espère que cela peut vous aider.

2
Wilson Wu

Voici un paquet qui 

  • Facilite l'intégration de JWT Bearer Security à votre application Asp Net Core 2.0+!
  • Intégration de l'authentification Azure Active Directory.
  • Intégration de l'authentification Facebook. 
  • Aussi, l'intégration d'interface utilisateur Swagger!

Il s’appelle AspNetCore.Security.Jwt

GitHub:

https://github.com/VeritasSoftware/AspNetCore.Security.Jwt

Le paquet intègre le jeton porteur JWT dans votre application comme ci-dessous:

1. Implémentez l'interface IAuthentication dans votre application

using AspNetCore.Security.Jwt;
using System.Threading.Tasks;

namespace XXX.API
{
    public class Authenticator : IAuthentication
    {        
        public async Task<bool> IsValidUser(string id, string password)
        {
            //Put your id authenication here.
            return true;
        }
    }
}

2. Dans votre Startup.cs

using AspNetCore.Security.Jwt;
using Swashbuckle.AspNetCore.Swagger;
.
.
public void ConfigureServices(IServiceCollection services)
{
    .
    .
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new Info { Title = "XXX API", Version = "v1" });
    });

    services.AddSecurity<Authenticator>(this.Configuration, true);
    services.AddMvc().AddSecurity();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    .
    .
    .
    // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), 
    // specifying the Swagger JSON endpoint.
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "XXX API V1");
    });

    app.UseSecurity(true);

    app.UseMvc();
}

3. Dans votre appsettings.json

Remarque: - Vous pouvez définir ces paramètres dans Secret Manager à l’aide du menu Gérer les secrets d’utilisateur (cliquez avec le bouton droit sur votre projet).

 {
     "SecuritySettings": {
        "Secret": "a secret that needs to be at least 16 characters long",
        "Issuer": "your app",
        "Audience": "the client of your app",
        "IdType":  "Name",
        "TokenExpiryInHours" :  2
    },
    .
    .
    .
}

Ensuite, vous obtiendrez automatiquement les points finaux:

/jeton

/Facebook

Lorsque vous appelez ces points de terminaison et que vous les avez authentifiés avec succès, vous récupérez un jeton de support JWT.

Dans votre contrôleur que vous souhaitez sécuriser

Vous devez marquer le contrôleur ou l'action que vous souhaitez sécuriser avec l'attribut Authorize, comme suit:

    using Microsoft.AspNetCore.Mvc;
    .
    .
    .

    namespace XXX.API.Controllers
    {
        using Microsoft.AspNetCore.Authorization;

        [Authorize]
        [Route("api/[controller]")]
        public class XXXController : Controller
        {
            .
            .
            .
        }
    }

Dans l’interface utilisateur Swagger, vous verrez automatiquement ces points de terminaison.

 Auth

0
Shane

Sécuriser l'API Web ASP.NET Core 2.0 avec l'authentification basée sur JWT Bearer Token standard 

https://fullstackmark.com/post/13/jwt-authentication-with-aspnet-core-2-web-api-angular-5-net-core-identity-and-facebook-login

& appliquez le filtre authorize comme suit 

 [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
0