2017-08-25 50 views
5

Mam aplikację ASP.NET MVC połączoną z usługą Azure AD B2C.Azure AD B2C - Zarządzanie rolami

w ustawieniach administratora I utworzeniu grupy Administratorzy:

enter image description here

W moim kodu chciałbym używać [Authorize(Roles = "Administrator")]

Przy regularnym Azure Active Directory łatwo było dodać (tylko 3 linie kodu). Ale na platformie Azure AD B2C nie mogę znaleźć żadnego tutoriala ani przykładu w działającej sieci. Może możesz mi powiedzieć, co muszę zmodyfikować.

Oto metoda ConfigureAuth moich 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}" 
     } 
    ); 
} 

Odpowiedz

5

Azure AD B2C jeszcze nie obejmują roszczeń grupa w tokena to wysyła do aplikacji zatem nie można wykonać takie same podejście opisane w usłudze Azure AD (która zawiera roszczenia grupowe w tokenie).

można obsługiwać tę funkcję zapytać głosując na nią w Azure forum AD B2C zwrotne: Get user membership groups in the claims with Azure AD B2C

Mając na uwadze powyższe, można zrobić kilka dodatkowych prac w tej aplikacji, aby go ręcznie pobierać tych roszczeń grupa roszczenia i wstrzyknij je do tokena.

Po pierwsze, zarejestruj osobną aplikację, która wywoła wykres Microsoft, aby pobrać oświadczenia grupy.

  1. idź do https://apps.dev.microsoft.com
  2. Utwórz aplikację z Uprawnienia aplikacji: Directory.Read.All.
  3. Dodaj tajemnicę aplikacji klikając wygenerować nowe hasło
  4. Dodaj platformie i wybierz Web i dać go przekierowania URI (np https://yourtenant.onmicrosoft.com/groups)
  5. Zgoda na tej aplikacji, przechodząc do: https://login.microsoftonline.com/YOUR_TENANT.onmicrosoft.com/adminconsent?client_id=YOUR_CLIENT_ID&state=12345&redirect_uri=YOUR_REDIRECT_URI

Następnie będziesz trzeba dodać kod następujący kod wewnątrz przewodnikaOnAuthorizationCodeReceived, 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

Pierwsze wielkie dzięki za odpowiedź! Pozostały mi tylko 2 pytania. Gdzie powinienem dodać ten adres URL (krok 4) i jakie jest Uri przekierowania (czy jest to odpowiedź uri z b2c?)? Inną kwestią do kodeksu: Co sould i wypełnić zmiennych: - GraphClientId - GraphRedirectUri - GraphClientSecret - userTokenCache I VisualStudio dzwoni komunikat o błędzie w: new C.Uzyskaj wielkie dzięki za pomoc :-) – DarkWing89

+0

Wykonane aktualizacje w celu dalszego wyjaśnienia instrukcji rejestracyjnych aplikacji i rozwiązania problemów c.Claim. – Saca

+0

GraphClientID = identyfikator aplikacji zarejestrowanej aplikacji, GraphSecret = Secret aplikacji, GraphRedirectUri = określony identyfikator URI przekierowania, userTokenCache powinien już być zdefiniowany z kodu, który jest już w tym OnAuthorizationCodeReceived z próbki. – Saca