2017-08-25 4 views
5

J'ai une application Asp.NET MVC connectée à Azure AD B2C.Azure AD B2C - Gestion des rôles

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

enter image description here

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

Avec Azure régulière Active Directory, il est facile d'ajouter (juste 3 lignes de code). Mais pour l'Azure AD B2C je ne trouve aucun tutoriel ou exemple sur le web qui fonctionne. Peut-être que vous pouvez me dire ce que j'ai besoin de modifier.

Voici la méthode ConfigureAuth de mes 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}" 
     } 
    ); 
} 

Répondre

5

Azure B2C AD ne comprend pas encore dans le groupe réclamations jeton envoie à l'application donc vous ne pouvez pas suivre la même approche comme vous l'avez souligné avec Azure AD (qui inclut les revendications de groupe dans le jeton).

Vous pouvez soutenir cette fonctionnalité demander en votant pour elle dans le Azure forum de rétroaction B2C AD: Get user membership groups in the claims with Azure AD B2C

Cela dit, vous pouvez faire un travail supplémentaire dans cette application pour avoir récupérer manuellement ces revendications, le groupe revendications et les injecter dans le jeton.

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

  1. Aller à https://apps.dev.microsoft.com
  2. Créer une application avec Permissions Application: Directory.Read.All.
  3. Ajouter un secret de l'application en cliquant sur Générer un nouveau mot de passe
  4. Ajouter une plate-forme et sélectionnez Web et lui donner une URI de redirection (par exemple https://yourtenant.onmicrosoft.com/groups)
  5. consentement à 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 aurez besoin d'ajouter du code le code suivant à l'intérieur du gestionnaire OnAuthorizationCodeReceived, right after redeeming the 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; 
} 
+0

Premier grand merci pour votre réponse! Je n'ai plus que 2 questions à ce sujet. Où dois-je ajouter cette URL (étape 4) et qu'est-ce que l'URL de redirection (est-ce la réponse uri de la b2c?)? Une autre question au Code: Que pourrais-je remplir les variables suivantes: - GraphClientId - GraphRedirectUri - GraphClientSecret - userTokenCache Et VisualStudio appelle un message d'erreur à: nouveau c.Réclamer Un grand merci pour votre aide :-) – DarkWing89

+0

A fait des mises à jour pour clarifier les instructions d'inscription de l'application et répondre aux questions de c.Claim. – Saca

+0

GraphClientID = ID d'application de l'application que vous avez enregistrée, GraphSecret = le secret d'application, GraphRedirectUri = l'URI de redirection que vous avez spécifiée, userTokenCache doit déjà être défini à partir du code qui est déjà dans ce OnAuthorizationCodeReceived de l'exemple. – Saca