3

Dans mon API web de base Asp.Net, j'utilisais Identity avec l'authentification de support Jwt. Cela fonctionnait sans problème. Voici le code pour que,Dotnet core 2.0 Utilisation de l'identité avec l'authentification JwtBearer

ConfigureServices():

services.AddIdentity<ApplicationUser, IdentityRole<int>>() 
      .AddEntityFrameworkStores<DataContext, int>() 
      .AddDefaultTokenProviders(); 

Configurer():

app.UseJwtBearerAuthentication(new JwtBearerOptions() 
      { 
       AutomaticAuthenticate = true, 
       AutomaticChallenge = true, 
       TokenValidationParameters = new TokenValidationParameters() 
       { 
        ValidIssuer = "localhost:4200", 
        ValidAudience = "localhost:4200", 
        ValidateIssuerSigningKey = true, 
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SuperSecretKey_GetThisFromAppSettings")), 
        ValidateLifetime = true 
       } 
      }); 

Et aujourd'hui, je suis passé à .net 2.0 et core toute la technologie empiler. De l'aide limitée disponible là-bas je code modifié comme celui-ci ..

ConfigureServices()

services.AddIdentity<ApplicationUser, ApplicationRole>() 
       .AddEntityFrameworkStores<DataContext>() 
       .AddDefaultTokenProviders(); 



services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) 
       .AddJwtBearer(options => 
       { 
        options.Authority = "localhost:4200"; 
        options.Audience = "localhost:4200"; 
        options.RequireHttpsMetadata = false; 
        options.TokenValidationParameters = new TokenValidationParameters() 
       { 
        ValidateIssuerSigningKey = true, 
        ValidateIssuer = true, 
        ValidateLifetime = true, 
        ValidIssuer = "localhost:4200", 
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SuperSecretKey_GetThisFromAppSettings")) 
       }; 
      }); 

Configurer()

app.UseAuthentication(); 

Maintenant, l'authentification ne fonctionne pas. On dirait qu'il est configuré en interne pour utiliser l'authentification par cookie.

Est-ce que quelqu'un d'autre est tombé sur ce scénario? Toute aide à ce sujet est vraiment appréciée!

Merci,

Répondre

5

Si je comprends bien le site MS

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x

Identity ajoute les cookies et définit l'authentification par défaut au système de cookie. Essayez de changer

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)

à

services.AddAuthentication(o => { 
    o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; 
}) 
+0

Hey, ça a marché! et merci beaucoup. Mais j'ai une autre question. Savez-vous comment arrêter la redirection par défaut vers la page de connexion lors d'un accès non autorisé? Au lieu de redirection, j'ai besoin d'envoyer le code d'état http au client. – Wijitha

+0

Pas de problème, je suppose qu'il existe de meilleurs moyens, mais parce que vous utilisez Identity et CookieAuthentication comme un schéma de 2ème autorisation, vous pouvez utiliser le chemin de connexion, car il retombe sur lui. services.ConfigureApplicationCookie (options => { options.LoginPath = "/ somecontr/somefunc"; }); et renvoyez tout ce dont vous avez besoin. public IActionResult somefunc() retourne StatusCode (418) –

1

En réponse à la question:

Savez-vous comment arrêter la redirection par défaut à la page de connexion lors d'un accès non autorisé?

J'ai trouvé cet article de blog par PioneerCode pour dotnet core 1 qui peut être utile.

Voilà comment je mis en œuvre et cela a fonctionné:

services.ConfigureApplicationCookie(options => { options.LoginPath = "/api/login"; 
    options.Events = new CookieAuthenticationEvents 
    { 
     OnRedirectToLogin = ctx => 
     { 
     if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == 200) 
     { 
      ctx.Response.StatusCode = 401; 
      return Task.FromResult<object>(null); 
     } 

     ctx.Response.Redirect(ctx.RedirectUri); 
     return Task.FromResult<object>(null); 
     } 
    }; 
    });