Azure Functions Http et sécurité : mise en place de l'authentification Basic (identifiant + mot de passe)
Dans les précédents articles de cette série, nous avons vu comment utiliser les access keys et comment utiliser Azure Active Directory pour sécuriser l'accès à vos Azure Functions. Dans cet article, nous verrons comment mettre en place une sécurité par login / mot de passe.
Cette solution n'est pas documentée et n'est pas standard. Nous allons juste mettre nous-même en place l'authentification Basic en interprétant le header Authorization à la main. Il y aura donc un appel fait jusqu'à votre azure function et si celle-ci est sur un plan à la consommation, cela sera facturé.
Le code est donc assez simple à écrire : on lit le header, on vérifie qu'on est en Basic, on décode la base64 et on vérifie que le login / mot de passe correspondent bien à ce qu'on attend.
if (!request.Headers.TryGetValue ("Authorization", out var values)) { return new StatusCodeResult (StatusCodes.Status403Forbidden); } // récupération du header var basicAuthenticationInfo = values .FirstOrDefault (hv => hv.StartsWith ("Basic ")); if (basicAuthenticationInfo == null) { return new StatusCodeResult (StatusCodes.Status403Forbidden); } // récupération de la valeur en base 64 var encoded64 = basicAuthenticationInfo .Split (" ").LastOrDefault ()?.Trim (); if (string.IsNullOrWhiteSpace (encoded64)) { return new StatusCodeResult (StatusCodes.Status403Forbidden); } // décodage de la base 64 string usernamePassword = Encoding.UTF8 .GetString(Convert.FromBase64String (encoded64)); int separatorIndex = usernamePassword.IndexOf (':'); if (separatorIndex < 0 || separatorIndex >= usernamePassword.Length) { return new StatusCodeResult (StatusCodes.Status403Forbidden); } // lecture username et password var username = usernamePassword.Substring (0, separatorIndex); var password = usernamePassword.Substring (separatorIndex + 1); // vérification que cela soit attendu if (string.IsNullOrWhiteSpace (username) || string.IsNullOrWhiteSpace (password)) { return new StatusCodeResult (StatusCodes.Status403Forbidden); } if (!username.Equals (userNameAttendu, StringComparison.Ordinal)) { return new StatusCodeResult (StatusCodes.Status403Forbidden); } if (!password.Equals (motDePasseAttendu, StringComparison.Ordinal)) { return new StatusCodeResult (StatusCodes.Status403Forbidden); } // Reste de notre algorithme
Côté Javascript, il faut créer le header et le fournir lors des appels à notre Azure Function :
$.ajax({ headers: { 'Authorization': 'Basic ' + btoa(userName + ':' + password) }, dataType: 'json', url: targetUrl, });
Simple mais efficace ;)
Happy coding !
Commentaires