Loupe

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 !

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus