web-dev-qa-db-fra.com

Azure AD B2C - Gestion des rôles

J'ai une application Asp.NET MVC connectée à Azure AD B2C.

Dans les paramètres administrateur, j'ai créé un groupe d'administrateurs:

enter image description here

Dans mon code, je voudrais utiliser [Authorize(Roles = "Administrator")]

Avec Azure Active Directory standard, il était facile d'ajouter (seulement 3 lignes de code). Mais pour Azure AD B2C, je ne trouve aucun tutoriel ou exemple sur le Web qui fonctionne. Vous pouvez peut-être me dire ce que je dois modifier.

Voici la méthode ConfigureAuth de mon Startup.Auth.cs

public void ConfigureAuth(IAppBuilder app)
{
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

    app.UseCookieAuthentication(new CookieAuthenticationOptions());

    app.UseOpenIdConnectAuthentication(
        new OpenIdConnectAuthenticationOptions
        {
            // Generate the metadata address using the tenant and policy information
            MetadataAddress = String.Format(AadInstance, Tenant, DefaultPolicy),

            // These are standard OpenID Connect parameters, with values pulled from web.config
            ClientId = ClientId,
            RedirectUri = RedirectUri,
            PostLogoutRedirectUri = RedirectUri,

            // Specify the callbacks for each type of notifications
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                RedirectToIdentityProvider = OnRedirectToIdentityProvider,
                AuthorizationCodeReceived = OnAuthorizationCodeReceived,
                AuthenticationFailed = OnAuthenticationFailed,
            },

            // Specify the claims to validate
            TokenValidationParameters = new TokenValidationParameters
            {
                NameClaimType = "name"
            },

            // Specify the scope by appending all of the scopes requested into one string (separated by a blank space)
            Scope = $"openid profile offline_access {ReadTasksScope} {WriteTasksScope}"
        }
    );
}
16
DarkWing89

Azure AD B2C n'inclut pas encore de revendications de groupe dans le jeton qu'il envoie à l'application , vous ne pouvez donc pas suivre la même approche que celle décrite avec Azure AD (qui inclut les revendications de groupe dans le jeton).

Vous pouvez prendre en charge cette fonctionnalité en la votant dans le forum de commentaires Azure AD B2C: Obtenez les groupes d'appartenance des utilisateurs dans les revendications avec Azure AD B2C

Cela étant dit, vous pouvez faire un travail supplémentaire dans cette application pour qu'elle récupère manuellement ces revendications du groupe et les injecte dans le jeton .

Tout d'abord, enregistrez une application distincte qui appellera Microsoft Graph pour récupérer les revendications de groupe .

  1. Accédez à https://apps.dev.Microsoft.com
  2. Créez une application avec Autorisations d'application: Directory.Read.All.
  3. Ajoutez un secret d'application en cliquant sur Générez un nouveau mot de passe
  4. Ajoutez une plate-forme, sélectionnez Web et attribuez-lui un URI de redirection (par exemple, https://yourtenant.onmicrosoft.com/groups)
  5. Consentez à cette application en accédant à: https://login.microsoftonline.com/YOUR_TENANT.onmicrosoft.com/adminconsent?client_id=YOUR_CLIENT_ID&state=12345&redirect_uri=YOUR_REDIRECT_URI

Ensuite, vous devrez ajouter le code suivant dans le gestionnaire OnAuthorizationCodeReceived, juste après avoir utilisé le code :

var authority = $"https://login.microsoftonline.com/{Tenant}";
var graphCca = new ConfidentialClientApplication(GraphClientId, authority, GraphRedirectUri, new ClientCredential(GraphClientSecret), userTokenCache, null);
string[] scopes = new string[] { "https://graph.Microsoft.com/.default" };

try
{
    AuthenticationResult authenticationResult = await graphCca.AcquireTokenForClientAsync(scopes);
    string token = authenticationResult.AccessToken;

    using (var client = new HttpClient())
    {
        string requestUrl = $"https://graph.Microsoft.com/v1.0/users/{signedInUserID}/memberOf?$select=displayName";

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUrl);
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

        HttpResponseMessage response = await client.SendAsync(request);
        var responseString = await response.Content.ReadAsStringAsync();

        var json = JObject.Parse(responseString);

        foreach (var group in json["value"])
            notification.AuthenticationTicket.Identity.AddClaim(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, group["displayName"].ToString(), System.Security.Claims.ClaimValueTypes.String, "Graph"));

        //TODO: Handle paging. 
        // https://developer.Microsoft.com/en-us/graph/docs/concepts/paging
        // If the user is a member of more than 100 groups, 
        // you'll need to retrieve the next page of results.
    }
} catch (Exception ex)
{
    //TODO: Handle
    throw;
}
16
Saca