Procedura: Usare il servizio di gestione ACS per configurare AD FS 2.0 come provider di identità Enterprise

Aggiornamento: 19 giugno 2015

Si applica a: Azure

Si applica a

  • Servizio di controllo di accesso di Microsoft® Azure™ (ACS)

  • Microsoft Active Directory® Federation Services (ADFS) 2.0

Riepilogo

Questo argomento illustra come aggiungere il provider di identità a uno spazio dei nomi o a un'applicazione relying party. Per eseguire questa attività, è possibile il servizio di gestione ACS. Il servizio di gestione è particolarmente utile quando si crea un'interfaccia utente personalizzata per la gestione di ACS e quando si automatizza l'aggiunta di nuovi tenant per soluzioni SaaS (Software as a Service) multi-tenant.

Contenuto

  • Obiettivi

  • Panoramica

  • Riepilogo dei passaggi

  • Passaggio 1: Raccogliere le informazioni di configurazione

  • Passaggio 2: Aggiungere riferimenti ai servizi e agli assembly richiesti

  • Passaggio 3: Implementare il proxy del servizio di gestione

  • Passaggio 4: Aggiungere un provider di identità

  • Passaggio 5: Verificare il lavoro eseguito

Obiettivi

  • Identificare le informazioni di configurazione e i prerequisiti.

  • Elencare i passaggi obbligatori.

  • Verificare la correttezza della configurazione.

Panoramica

Il servizio di gestione ACS è un servizio Web che espone le funzionalità ACS al codice. Il servizio di gestione ACS può accedere a tutte le funzionalità ACS, incluso il subset di funzionalità disponibile nell'interfaccia utente del portale di gestione ACS.

L'aggiunta di Microsoft come provider di identità al servizio contenitore di Azure consente di riutilizzare gli investimenti effettuati nella gestione delle identità aziendali per soluzioni basate sul cloud. Per configurare come provider di identità, è necessario scrivere codice che segue passaggi specifici. Questo argomento descrive i passaggi di base.

Riepilogo dei passaggi

  • Passaggio 1: Raccogliere le informazioni di configurazione

  • Passaggio 2: Aggiungere riferimenti ai servizi e agli assembly richiesti

  • Passaggio 3: Implementare il proxy del servizio di gestione

  • Passaggio 4: Aggiungere un provider di identità

  • Passaggio 5: Verificare il lavoro eseguito

Passaggio 1: Raccogliere le informazioni di configurazione

Questo passaggio spiega come raccogliere le informazioni di configurazione richieste. È necessario raccogliere le seguenti informazioni:

  • Nome utente dell'identità del servizio di gestione. Il valore predefinito è ManagementClient.

  • Password dell'identità del servizio di gestione.

  • Nome spazio dei nomi.

  • Nome host ACS: accesscontrol.windows.net

  • Stringa di certificato di firma: ottenere la stringa del certificato di firma di AD FS dalla distribuzione.

Per individuare la password e il nome utente dell'identità del servizio di gestione, seguire questa procedura.

  1. Passare al portale di gestione Microsoft Azure (https://manage.WindowsAzure.com), accedere e quindi fare clic su Active Directory. (Suggerimento per la risoluzione dei problemi: elemento "Active Directory" mancante o non disponibile) Per gestire uno spazio dei nomi Controllo di accesso, selezionare lo spazio dei nomi e quindi fare clic su Gestisci. Altrimenti, fare clic su Spazi dei nomi controllo di accesso, selezionare lo spazio dei nomi, quindi fare clic su Gestisci.

  2. Fare clic su Management Service, quindi selezionare un servizio di gestione, ad esempio ManagementClient.

  3. Il valore del campo Nome è il nome utente dell'identità del servizio di gestione.

  4. Nella sezione Credentials fare clic su Password. Il valore del campo della password corrisponde alla password dell'identità del servizio di gestione.

Dopo aver raccolto le informazioni necessarie, seguire questa procedura per creare un'applicazione console di esempio che eseguirà il codice da aggiungere come provider di identità:

  1. Avviare Visual Studio e creare un nuovo progetto di applicazione console.

  2. Nella classe Program assegnare i valori delle informazioni di configurazione alle variabili dell'ambito del modulo. Il seguente codice illustra come effettuare questa operazione.

    static string serviceIdentityUsernameForManagement = "ManagementClient";
    static string serviceIdentityPasswordForManagement = "ManagementClientPasswordValue";
    
    static string serviceNamespace = "MyNameSpaceNoDots";
    static string acsHostName = "accesscontrol.windows.net";
    
    static string signingCertificate = "Very long string representing ADFS signing certificate";
    
    static string cachedSwtToken;
    static string identityProviderName = "My Other ADFS Identity Provider";
    

Passaggio 2: Aggiungere riferimenti ai servizi e agli assembly richiesti

Questo passaggio consente di identificare e aggiungere le dipendenze richieste ai servizi e agli assembly.

Per aggiungere le dipendenze richieste ai servizi e agli assembly

  1. Aggiungere un riferimento a System.Web.Extensions.

  2. Aggiungere un riferimento al servizio di gestione. L'URL del servizio di gestione, univoco per lo spazio dei nomi, ha un aspetto simile al seguente:

    https:// YOURNAMESPACE.accesscontrol.windows.net/v2/mgmt/service

  3. Aggiungere le seguenti dichiarazioni.

    using System.Web; 
    using System.Net; 
    using System.Data.Services.Client; 
    using System.Collections.Specialized; 
    using System.Web.Script.Serialization;
    

Passaggio 3: Implementare il proxy del servizio di gestione

Questo passaggio consente di creare un metodo che incapsula l'implementazione del proxy del servizio di gestione.

Per implementare il proxy del servizio di gestione

  1. Aggiungere il metodo seguente alla classe Program.

    public static ManagementService CreateManagementServiceClient()
            {
                string managementServiceHead = "v2/mgmt/service/";
                string managementServiceEndpoint = 
    string.Format("https://{0}.{1}/{2}", 
    serviceNamespace, 
    acsHostName, 
    managementServiceHead);
                ManagementService managementService = 
    new ManagementService(new Uri(managementServiceEndpoint));
    
                managementService.SendingRequest += GetTokenWithWritePermission;
    
                return managementService;
            }
    
  2. Implementare il metodo GetTokenWithWritePermission e i relativi metodi di supporto. Il token SWT OAuth verrà aggiunto all'intestazione Authorization della richiesta HTTP.

            public static void GetTokenWithWritePermission(object sender, 
    SendingRequestEventArgs args)
            {
                GetTokenWithWritePermission((HttpWebRequest)args.Request);
            }
    
            public static void GetTokenWithWritePermission(HttpWebRequest args)
            {
                if (cachedSwtToken == null)
                {
                    cachedSwtToken = GetTokenFromACS();
                }
    
                args.Headers.Add(HttpRequestHeader.Authorization, 
     string.Format("OAuth {0}", 
     cachedSwtToken));
            }
    
            private static string GetTokenFromACS()
            {
                // request a token from ACS
                WebClient client = new WebClient();
                client.BaseAddress = string.Format("https://{0}.{1}", 
          serviceNamespace, 
          acsHostName);
    
                NameValueCollection values = new NameValueCollection();
    
                values.Add("grant_type", "password");
                values.Add("client_id", serviceIdentityUsernameForManagement);
                values.Add("username", serviceIdentityUsernameForManagement);
                values.Add("client_secret", serviceIdentityPasswordForManagement);
                values.Add("password", serviceIdentityPasswordForManagement);
    
                byte[] responseBytes = 
    client.UploadValues("/v2/OAuth2-13/rp/AccessControlManagement", 
          "POST", 
          values);
    
                string response = Encoding.UTF8.GetString(responseBytes);
    
                // Parse the JSON response and return the access token 
                JavaScriptSerializer serializer = new JavaScriptSerializer();
    
                Dictionary<string, object> decodedDictionary = 
    serializer.DeserializeObject(response) as Dictionary<string, object>;
    
                return decodedDictionary["access_token"] as string;
    
            }
    

Passaggio 4: Aggiungere un provider di identità

Questo passaggio aggiunge come provider di identità usando il proxy del servizio di gestione creato in precedenza.

Per aggiungere ADFS 2.0 come provider di identità

  1. Inizializzare il proxy del servizio di gestione.

    ManagementService svc = CreateManagementServiceClient();
    
  2. Aggiungere il provider di identità come autorità emittente.

    Issuer issuer = new Issuer
           {
           Name = identityProviderName
    };
           svc.AddToIssuers(issuer);
           svc.SaveChanges(SaveChangesOptions.Batch);
    
  3. Creare un provider di identità.

    IdentityProvider identityProvider = new IdentityProvider()
    {
        DisplayName = identityProviderName,
        Description = identityProviderName,
        WebSSOProtocolType = "WsFederation",
        IssuerId = issuer.Id
    };
           svc.AddObject("IdentityProviders", identityProvider);
    
  4. Creare una chiave per la firma del provider di identità in base al certificato ottenuto in precedenza.

    IdentityProviderKey identityProviderKey = new IdentityProviderKey()
    {
        DisplayName = "SampleIdentityProviderKeyDisplayName",
        Type = "X509Certificate",
        Usage = "Signing",
        Value = Convert.FromBase64String(signingCertificate),
        IdentityProvider = identityProvider,
        StartDate = startDate,
        EndDate = endDate,
    };
          svc.AddRelatedObject(identityProvider, 
    "IdentityProviderKeys", 
    identityProviderKey);
    
  5. Aggiornare l'indirizzo di accesso del provider di identità.

    IdentityProviderAddress realm = new IdentityProviderAddress()
    {
        Address = "http://SampleIdentityProvider.com/sign-in/",
        EndpointType = "SignIn",
        IdentityProvider = identityProvider,
    };
    svc.AddRelatedObject(identityProvider, "IdentityProviderAddresses", realm);
    
    svc.SaveChanges(SaveChangesOptions.Batch);
    
  6. Rendere disponibile il provider di identità per le relying party, escludendo il servizio di gestione.

    foreach (RelyingParty rp in svc.RelyingParties)
    {
        // skip the built-in management RP. 
        if (rp.Name != "AccessControlManagement")
        {
            svc.AddToRelyingPartyIdentityProviders(new RelyingPartyIdentityProvider()
            {
                IdentityProviderId = identityProvider.Id,
                RelyingPartyId = rp.Id
            });
        }
    }
    
    svc.SaveChanges(SaveChangesOptions.Batch);
    

Passaggio 5: Verificare il lavoro eseguito

Per eseguire il test della configurazione creata

  1. Nella pagina Access Control Service fare clic sul collegamento Rule Groups nella sezione Trust Relationships.

  2. Fare clic su una qualsiasi regola disponibile.

  3. Nella pagina Edit Rule Group fare clic sul collegamento Add Rule.

  4. Nella pagina Add Claim Rule scegliere il provider di identità aggiunto dall'elenco a discesa disponibile nella sezione Claim Issuer.

  5. Lasciare invariati i rimanenti valori predefiniti.

  6. Fare clic su Salva.

È stata creata una regola pass-through per il provider di identità.