Il presente progetto spiega come proteggere le Azure Function con Azure Active Directory B2C.
Prepariamo il Tenant configurando:
- Un applicazione di tipo Web che chiameremo Azure Function senza alcun URI di reindirizzamento per esporre il nostro ambito di utilizzo (function.read);
- Un applicazione di tipo Web che chiameremo Test Function con reindirizzamento a jwt.ms per testare la nostra Azure Function;
- Un applicazione di tipo SPA (single page application) che chiameremo React Appt con reindirizzamento alla nostra app di test in react in locale http://localhost:3000;
Per gli ultimi 2 punti sopra elencati:
- nella sezione "Authentication" dell'App registrata verificate di avere selezionato quali token rilasciare (nel nostro caso spuntare le voci Access Tokens e ID Tokens);
- nella sezione "Api Permission" dell'App registrata verificate di aver fornito il consenso ammministrativo all'ambito (function.read).
Terminato il Tenant con la configurazione degli User Flows, passate alla creazione della Function:
Inserire nella sezione- Application (client) ID: il Client ID dell App registrata in Azure B2C come Azure Function;
- Client secret (recommended): lasciare vuoto;
- Issuer URL: inserire l'Endpoint Azure AD B2C OpenID Connect metadata document ricordandosi di sostituire <policy-name> con il campo Name dello User Flow "Sign up and sign in" configurato in precedenza;
- Allowed token audiences: il Client ID dell App registrata in Azure B2C come Azure Function.
Codice di prova da inserire come primo test
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using System.Linq;
[FunctionName("UserInformationSimple")]
public static Task<IActionResult> Run(
HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
var User = req.HttpContext.User;
if (User.Identity.IsAuthenticated)
{
log.LogInformation("Utente Autenticato");
var claims = User.Claims;
var returnValue = new
{
Name = claims.Where(c => c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname").FirstOrDefault()?.Value,
Surname = claims.Where(c => c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname").FirstOrDefault()?.Value,
City = claims.Where(c => c.Type == "city").FirstOrDefault()?.Value,
Email = claims.Where(c => c.Type == "emails").FirstOrDefault()?.Value
};
return Task.FromResult<IActionResult>(new ObjectResult(returnValue));
}
log.LogInformation("Utente non Autenticato");
return Task.FromResult<IActionResult>(new ObjectResult("Forbidden") { StatusCode = 403 });
}
Link per scaricare il progetto react dalla documentazione ufficiale Microsoft: msal react project
Link problema noto del non funzionamento della "RequiredScope" in una Azure Function: RequiredScope not work