2017-09-26 5 views
1

J'ai installé un authserver OpenIdDict pour l'utiliser avec notre application web mvc core 2.0 existante. J'utilise le flux de code et fait un serveur de ressources mvc webapp de test avant d'implémenter la partie OpenIdConnect sur nos applications de production.OpenIddict MVC core 2.0 et JWT sur l'API du serveur de ressources

Tout semble fonctionner comme prévu et je peux me connecter et accéder à mes ressources.

J'ai besoin d'obtenir l'authentification de porteur d'api fonctionnant sous la nouvelle architecture d'autorisation pour mes clients de repos. Api est placé sur le même serveur de ressources.

J'ai mis mon OpenIddict pour JWT en utilisant:

  options.AllowPasswordFlow(); 
      options.UseJsonWebTokens(); 
      options.AddSigningKey(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value))); 

... ajouté JwtBearer

 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 
     JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear(); 

     services.AddAuthentication() 
      .AddJwtBearer(options => 
      { 
       options.Authority = "http://localhost:17004/"; 
       options.Audience = "MyAudience"; 
       options.RequireHttpsMetadata = false; 
       options.TokenValidationParameters = new TokenValidationParameters 
       { 
        NameClaimType = OpenIdConnectConstants.Claims.Subject, 
        RoleClaimType = OpenIdConnectConstants.Claims.Role, 
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value)) 
       }; 
      }); 

... et a ajouté dans le code AuthorizationController.Exchange pour le traitement des demandes de jeton de flux de mot de passe.

Sur mon serveur de ressources Startup.cs j'ai ajouté AddOpenIdConnect et ajouté signingKey (même clé que sur mon serveur d'authentification).

  options.ResponseType = OpenIdConnectResponseType.Code; 
      options.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet; 
      options.TokenValidationParameters = new TokenValidationParameters() 
      { 
       IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value)) 
      }; 
      options.Authority = "http://localhost:17004/"; 

Après avoir réglé ce mon serveur de ressources peut encore authentifier et tout fonctionne et je peux utiliser un restclient pour obtenir un jeton JWT de mon serveur auth mais en essayant d'accéder à mon api sur le serveur de ressources échoue parce qu'il n'est pas un validateur pour un schéma support.

Si j'ajoute l'appel pour appeler AddBearerToken sur le serveur de ressources avec la même signingKey dans TokenValidationParameters, cela fonctionne réellement. Le défi est réussi et j'ai accès à mes ressources.

Cependant, je soupçonne que ma configuration est loin d'être corrigée, car je peux voir que, lorsque j'appelle mon API, la validation de mon jeton se passe sur le serveur de ressources, donc il me reste 2 questions.

  1. Est-il possible que le middleware JwtBearer transmette la validation à mon serveur d'authentification? (est-ce que openidConnect peut le gérer?)

  2. Est-il possible de faire en sorte que mon serveur de ressources envoie des demandes de jeton de transfert/passthru à mon serveur d'authentification afin que mon client api de repos n'ait pas à traiter avec 2 serveurs?

Répondre

1

Est-il possible que le middleware JwtBearer transmette la validation à mon serveur d'authentification? (Peut gérer OpenID Connect?)

Le middleware porteur JWT effectue toujours une validation locale en utilisant la clé de signature récupérée à partir du point final de configuration de OpenIddict. Vous n'avez aucun moyen de le forcer à déléguer cette tâche à OpenIddict.

Est-il possible de faire mon serveur de ressources demandes d'émission de jeton avant/passthru trop mon serveur auth si mon client reste api ont l'habitude de traiter avec 2 serveurs?

Si vous souhaitez déléguer la partie de validation de jeton à votre serveur d'autorisation, n'utilisez pas le middleware JWT. Au lieu de cela, activez l'introspection dans les options OpenIddict, créez un nouvel enregistrement d'application client confidentiel et utilisez le aspnet-contrib introspection middleware, qui utilisera des appels HTTP backchannel pour valider les jetons entrants.

+0

Après avoir ajouté un certificat au serveur d'authentification OpenIddict, les jwks ont fonctionné et le côté serveur de ressources a pu récupérer la clé, et je comprends que la validation se fera sur le serveur de ressources (c'est l'enregistrement multiple). Mais mon application client REST doit toujours contacter directement le serveur d'authentification pour l'émission initiale de jetons. Puis-je y arriver via mon serveur de ressources? –

+0

... vous avez également mentionné que pour mon cas, je ne devrais pas utiliser OpenIdConnect sur mon serveur de ressources. Pouvez-vous donner un exemple de configuration du serveur de ressources en utilisant uniquement JwtBearer? (Après avoir enlevé openidconnect, le challenge dans auth.controller échoue car il n'y a pas de gestionnaire pour le schéma openidconnect.) Si je change le schéma pour "Bearer" il ne contacte jamais le serveur auth et donne 401.) –

+0

J'ai fini par faire une petite méthode de découverte serveur de ressources indiquant à mon client REST où trouver l'autorité, puis utiliser .well-known/openid-configuration sur le serveur d'authentification pour trouver le point de terminaison de jeton. –

0

JWT est un format de jeton requis pour OpenIdConnect. Vous pouvez utiliser n'importe quel format de jeton avec Oauth2, y compris JWT. Donc, vous n'avez pas besoin d'ignorer le JWT.

+0

Je pense que j'ai un problème pour comprendre certaines des bases car les mots que vous écrivez n'ont aucun sens pour moi. J'ai passé beaucoup de temps à essayer de comprendre ce qui fait partie de quel flux et quelle technologie est utilisée et je suis complètement perdu entre trouver comment configurer mvc core 2.0 et comment ça devrait être mis en œuvre pour fonctionner. –

+0

J'ai écrit un article à ce sujet et il a un aperçu de ces concepts. Lien est ici - https://www.linkedin.com/pulse/microservices-security-openid-connect-manish-singh – ManishSingh

+0

Bon article. J'ai également découvert plus au sujet de mon installation de mvc et ai édité ma question puisque je peux maintenant demander les bons. –