web-dev-qa-db-fra.com

Utilisation de jetons Web JSON (JWT) avec les fonctions Azure (SANS utilisation de Active Directory)

Je suis sûr que quelqu'un l'a déjà fait, mais je n'ai pas encore trouvé de documentation concernant l'implémentation de JWT par Microsoft. La documentation officielle de Microsoft pour leur bibliothèque JWT est essentiellement une page vide, voir:

https://docs.Microsoft.com/en-us/dotnet/framework/security/json-web-token-handler-api-reference

Donc, voici ce que je (et je suis sûr que bien d’autres) aimerions accomplir:

Définition: ID utilisateur = nom d'utilisateur ou adresse électronique utilisé pour se connecter à un système.

AUTHENTIFICATION:

  1. Un utilisateur se connecte. L'utilisateur remplit un formulaire Web et le système envoie (via HTTPS POST) l'ID et le mot de passe de l'utilisateur (hachés) au serveur afin de l'authentifier/valider.

  2. Le serveur authentifie l'utilisateur. L'ID utilisateur et le mot de passe sont comparés aux valeurs enregistrées dans la base de données et, si NON valide, une réponse de connexion non valide est renvoyée à l'appelant.

  3. Créer un jeton JWT - ???? Aucune documentation disponible!

  4. Renvoyez le jeton JWT à l'appelant - ???? - Je suppose dans un en-tête? via JSON, pas sûr - encore une fois - pas de documentation.

Étant donné le code ci-dessous, quelqu'un peut-il fournir un exemple de code pour les étapes 3 et 4?

  [FunctionName( "authenticate" )]
  public static async Task<HttpResponseMessage> Run( [HttpTrigger( AuthorizationLevel.Anonymous, "get", "post", Route = null )]HttpRequestMessage req, TraceWriter log )
  {

   // Step 1 - Get user ID and password from POST data

   /*
   * Step 2 - Verify user ID and password (compare against DB values)
   * If user ID or password is not valid, return Invalid User response
   */

   // Step 3 - Create JWT token - ????

   // Step 4 - Return JWT token - ????

  }

AUTORISATION:

En supposant que l'utilisateur a été authentifié et qu'il dispose maintenant d'un jeton JWT (je suppose que le jeton JWT est enregistré dans la session des utilisateurs; si quelqu'un souhaite fournir plus d'informations, veuillez le faire):

  1. Une demande POST est adressée à une fonction Azure pour qu'elle fasse quelque chose (comme obtenir la date de naissance des utilisateurs). Le jeton JWT obtenu ci-dessus est chargé (à partir des données POST ou d'un en-tête - est-ce important?) Avec toutes les autres données requises par la fonction.

  2. Le jeton JWT est validé - ???? Aucune documentation disponible!

  3. Si le jeton JWT n'est PAS valide, une réponse BadRequest est renvoyée par la fonction.

  4. Si le jeton JWT est valide, la fonction utilise les données qui lui sont transmises pour traiter et émettre une réponse.

Étant donné le code ci-dessous, quelqu'un peut-il fournir un exemple de code pour les étapes 1 et 2?

  [FunctionName( "do_something" )]
  public static async Task<HttpResponseMessage> Run( [HttpTrigger( AuthorizationLevel.Anonymous, "get", "post", Route = null )]HttpRequestMessage req, TraceWriter log )
  {

   // Step 1 - Get JWT token (from POST data or headers?)

   // Step 2 - Validate the JWT token - ???

   // Step 3 - If JWT token is not valid, return BadRequest response

   // Step 4 - Process the request and return data as JSON

  }

Toute information aiderait vraiment ceux d'entre nous (moi) à comprendre comment utiliser JWT avec des fonctions Azure (anonymes) afin de créer une API "sécurisée" REST.

Merci d'avance.

5
bdcoder

Toute information aiderait vraiment ceux d'entre nous (moi) à comprendre comment utiliser JWT avec des fonctions Azure (anonymes) afin de créer une API "sécurisée" REST.

Si je comprends bien, vous pouvez utiliser la bibliothèque associée dans votre code de fonction Azure pour générer/valider le jeton JWT. Voici quelques tutoriels, vous pouvez vous y référer:

Créer et consommer des jetons JWT en C #

Jwt.Net, une implémentation JWT (JSON Web Token) pour .NET

Authentification JWT pour Asp.Net Web Api

De plus, vous pouvez utiliser Authentification/autorisation du service d'application pour configurer la fonction Authentification/autorisation au niveau de l'application. Vous pouvez aller dans les paramètres de votre application fonctionnelle, cliquez sur "GESTION DE RÉSEAU> Authentification/Autorisation" sous l'onglet Fonctionnalités de la plate-forme. Activez l'authentification du service d'application et choisissez Autoriser les demandes anonymes (aucune action) comme suit:

 enter image description here

Vous pouvez créer une fonction HttpTrigger avec un accès anonyme pour la journalisation de l'utilisateur et renvoyer le jeton JWT si l'utilisateur existe. Pour les API protégées REST, vous pouvez suivre l'exemple de code ci-dessous:

if(System.Security.Claims.ClaimsPrincipal.Current.Identity.IsAuthenticated)
{
   //TODO: retrieve the username claim
   return req.CreateResponse(HttpStatusCode.OK,(System.Security.Claims.ClaimsPrincipal.Current.Identity as ClaimsIdentity).Claims.Select(c => new { key = c.Type, value = c.Value }),"application/json");
}
else
{
    return req.CreateResponse(HttpStatusCode.Unauthorized,"Access Denied!"); 
}

Pour générer le jeton JWT utilisé dans l'authentification App Service, vous pouvez suivre Comment: utiliser une authentification personnalisée pour votre application et le code sous le contrôleur d'API personnalisé CustomAuthController du livre d'adrian hall sur Authentification personnalisée pour créer le fichier JWT jeton.

METTRE À JOUR:

Pour l’approche d’authentification personnalisée sous App Service Authentication, je souhaite simplement pouvoir utiliser l’authentification/autorisation fournie par EasyAuth. J'ai testé cette approche et constaté qu'elle pouvait fonctionner de mon côté. Op pourrait envoyer le nom d'utilisateur et le mot de passe à HttpTrigger pour l'authentification, puis le serveur HttpTrigger doit valider les informations de l'utilisateur et utiliser Microsoft.Azure.Mobile.Server.Login package pour l'émission du jeton Authentification du service d'application au client, celui-ci pourrait extraire le jeton de la propriété AuthenticationToken. Les requêtes suivantes sur les API protégées pourraient ressembler à ceci:

https://<your-funapp-name>.azurewebsites.net/api/<httpTrigger-functionName>
Header: x-zumo-auth:<AuthenticationToken>

REMARQUE:

Pour cette approche, les fonctions HttpTrigger associées doivent autoriser l'accès anonyme et l'Authentification de service d'application doit également choisir Autoriser les demandes anonymes (aucune action). Sinon, l'authentification App Service et l'authentification au niveau fonction valideraient la demande. Pour les API protégées, op doit ajouter manuellement la vérification System.Security.Claims.ClaimsPrincipal.Current.Identity.IsAuthenticated.

8
Bruce Chen

Essayez ceci: https://liftcodeplay.com/2017/11/25/validating-auth0-jwt-tokens-in-Azure-functions-aka-how-to-use-auth0-with-Azure-functions/ J'ai réussi à le faire fonctionner avec ce guide. Cela a pris un certain temps à cause des versions de nuget.

Suivez ce guide correctement et utilisez les versions de nuget suivantes

IdentityModel.Protocols (2.1.4)
IdentityModel.Protocols.OpenIdConenct (2.1.4)
IdentityModel.Tokens.Jwt (5.1.4)

Oh, et le guide vous dit d'écrire votre AUDIENCE en tant que lien d'api, ne le faites pas. Vous obtiendrez une erreur non autorisée. Écrivez simplement le nom de votre api, par exemple Myapi 

Si vous obtenez une erreur indiquant que System.http.formatting n'est pas chargé lors de l'exécution de la fonction, essayez de réinstaller NET.Sdk.Functions et ignorez l'avertissement concernant la restauration de AspNet.WebApi.Client à l'aide de .NETFramework. Et redémarrez Visual Studio.

3
Charles Dickens

Ce que vous décrivez est quelque chose que vous devriez être capable de faire vous-même en faisant un peu de recherche. Pour répondre à vos questions spécifiques:

Créer un jeton JWT - ???? Aucune documentation disponible!

Le lien que Bruce vous a donné donne un bel exemple de création d’un JWT: https://www.codeproject.com/Tips/1208535/Create-And-Consume-JWT-Tokens-in-csharp

Renvoyez le jeton JWT à l'appelant - ???? - Je suppose dans un en-tête? via JSON, pas sûr - encore une fois - pas de documentation.

Il n'y a pas de documentation parce que vous êtes en train d'inventer votre propre protocole. Cela signifie que la façon dont vous le faites est entièrement à vous et à vos exigences d’application. S'il s'agit d'une action de connexion, il peut être judicieux de la renvoyer dans le contenu de la réponse HTTP. Assurez-vous simplement que vous utilisez HTTPS pour que le jeton reste protégé sur le fil.

Une demande POST est adressée à une fonction Azure pour qu'elle fasse quelque chose (comme obtenir la date de naissance des utilisateurs). Le jeton JWT obtenu ci-dessus est chargé (à partir des données POST ou d'un en-tête - est-ce important?) Avec toutes les autres données requises par la fonction.

La façon dont vous envoyez le jeton est, à nouveau, entièrement à vous. La plupart des plates-formes utilisent l'en-tête de requête HTTP Authorization, mais ce n'est pas obligatoire si vous ne le souhaitez pas.

Le jeton JWT est validé - ???? Aucune documentation disponible!

Utilisez la méthode ValidateToken de JwtSecurityTokenHandler (voir le lien précédent pour obtenir la valeur JwtSecurityTokenHandler). Docs here: https://msdn.Microsoft.com/en-us/library/dn451155(v=vs.114).aspx .

0
Chris Gillum