2017-09-12 1 views
0

Mise à niveau de l'application World Trip de Scott Wildermuth vers ASP.NET Core 2.0. Le code ci-dessous ne fonctionne pas.L'authentification par cookie ne fonctionne pas avec la politique d'autorisation dans le noyau asp.net

Étant donné que j'utilise deux types d'authentification et que j'aimerai que les deux fonctionnent sur les contrôleurs api, j'ai décidé d'utiliser la politique d'autorisation.

public void ConfigureServices(IServiceCollection services) 
{ 
    //Some codes here 
    services.AddAuthentication() 
     .AddCookie() 
     .AddJwtBearer(**Implementation is fine**); 

    services.AddAuthorization(options => 
    { 
     options.AddPolicy("Authenticated", policy => 
     { 
      policy.AddAuthenticationSchemes(
       CookieAuthenticationDefaults.AuthenticationScheme, 
       JwtBearerDefaults.AuthenticationScheme) 
        .RequireAuthenticatedUser(); 
     }); 
    }); 
} 

maintenant dans mes contrôleurs,

namespace TheWorld.Controllers.Api 
{ 
    [Route("api/trips")] 
    [Authorize(policy: "Authenticated")] 
    public class TripsController : controller 
    { 
     // Implementation is fine 
    } 
} 

Les demandes à venir avec l'authentification par cookie du client (web) est jamais vu comme authentifié tandis que les demandes de Jwt clients authentifiés fonctionnent comme prévu.

Cela fonctionne uniquement avec l'authentification par cookie si j'utilise le [Authorize] simple sur le contrôleur, dans lequel asp.net core choisit simplement l'authentification de cookie par défaut et n'accepte jamais les demandes des clients Jwt.

Répondre

0
policy.AddAuthenticationSchemes(scheme1, scheme2) 

Cela signifie que pour l'authentification de la stratégie pour réussir, les deux systèmes d'authentification spécifiés doivent réussir. Vos deux schémas d'authentification sont probablement configurés de sorte que lorsque l'authentification JWT réussit, elle succède automatiquement à l'authentification par cookie (pour définir le cookie dans ce cas, donc sur d'autres requêtes, le jeton JWT n'est plus nécessaire mais le cookie est assez). Ainsi, lorsque l'authentification JWT est réussie, l'authentification par cookie est également réussie. Cependant, l'inverse n'est pas vrai: Si vous n'utilisez que le cookie pour établir l'authentification, alors le jeton JWT peut ne pas être là du tout.

Si vous ne vous souciez pas de lequel schéma d'authentification fourni l'authentification, vous devez simplement supprimer l'appel AddAuthenticationSchemes. En disant policy.RequireAuthenticatedUser() vous êtes en train de dire qu'il doit y avoir un certain schéma d'authentification qui authentifie avec succès l'utilisateur.

Ceci est par. exactement le même comportement, la politique par défaut (avec juste [Authorize]) a.

+0

Merci @poke. J'ai déjà essayé ce que vous avez mentionné et ce qui s'est passé dans ce cas était que 'CookieAuthentication' a été choisi par défaut et' JwtBearer' n'a jamais été utilisé. Merci. –

+0

Merci @poke. J'ai finalement découvert que le problème venait de 'AspNetCore.Identity'. La valeur par défaut 'AuthenticationScheme' qui l'accompagnait utilisait le nom du schéma' "Identity.Application" '. Ainsi, l'application a fonctionné après que j'ai changé 'CookieAuthenticationDefaults.AuthenticationScheme' à' "Identity.Application" 'avec ou sans un appel à' .AddCookie' sur 'services.AddAuthentication'. –