Condividi tramite


Procedura: Usare il servizio di gestione ACS per configurare certificati e chiavi

Aggiornamento: 19 giugno 2015

Si applica a: Azure

Si applica a

  • Microsoft Azure Active Directory Access Control (anche noto come Servizio di controllo di accesso o ACS)

Panoramica

È possibile configurare certificati e chiavi ACS usando il portale di gestione ACS o il servizio di gestione ACS. L'uso del servizio di gestione ACS può essere più efficiente se si crea un'interfaccia utente personalizzata per la gestione di ACS o se si vuole automatizzare l'onboarding di un nuovo tenant per soluzioni SaaS (Software as a Service) multi-tenant.

Per altre informazioni sull'uso del portale di gestione ACS per configurare certificati e chiavi, vedere Certificati e chiavi.

Procedura per la configurazione di certificati e chiavi mediante il servizio di gestione ACS

Importante

Prima di eseguire i passaggi seguenti, assicurarsi che il sistema soddisfi tutti i requisiti di .NET Framework e della piattaforma riepilogati in Prerequisiti ACS.

Per configurare certificati e chiavi usando il servizio di gestione ACS, seguire questa procedura:

  • Passaggio 1 - Raccogliere le informazioni di configurazione di ACS

  • Passaggio 2 - Creare un'applicazione console di esempio

  • Passaggio 3: Aggiungere riferimenti ai servizi e agli assembly necessari

  • Passaggio 4: Implementare il client del servizio di gestione

  • Passaggio 5: installare certificati e chiavi

    • Aggiungere un certificato per la firma di token per lo spazio dei nomi ACS

    • Aggiungere un certificato per la firma di token per un'applicazione relying party

    • Aggiungere una chiave simmetrica per la firma di token per lo spazio dei nomi ACS

    • Aggiungere una chiave simmetrica per la firma di token per un'applicazione relying party

    • Aggiungere un certificato di crittografia dei token

    • Aggiungere un certificato di decrittografia dei token

Passaggio 1 - Raccogliere le informazioni di configurazione di ACS

È possibile usare il portale di gestione ACS per raccogliere le informazioni di configurazione necessarie. Per altre informazioni, vedere Portale di gestione ACS.

Per raccogliere le informazioni di configurazione di ACS

  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)

  2. Per gestire uno spazio dei nomi di Controllo di accesso, selezionare lo spazio dei nomi, 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.

  3. Fare clic su Management service, fare clic su ManagementClient e quindi fare clic su Password.

  4. Copiare il valore nel campo Password.

  5. Fare clic su Management service. Ottenere il valore dello spazio dei nomi del servizio e del nome host ACS. Se l'URL del servizio di gestione è http://contoso.accesscontrol.windows.net, lo spazio dei nomi è contoso e il nome host è accesscontrol.windows.net.

Passaggio 2 - Creare un'applicazione console di esempio

In questo passaggio si crea un'applicazione console di esempio in grado di eseguire il codice per aggiungere i gruppi di regole e le regole ACS.

Per creare un'applicazione console di esempio

  1. Aprire Visual Studio 2012 e creare un nuovo progetto di applicazione console nel modello Windows installato.

  2. Aggiungere il seguente codice alla classe Program e quindi assegnare le variabili serviceIdentityPasswordForManagement, serviceNamespace e acsHostName alle informazioni di configurazione appropriate raccolte nel passaggio precedente.

    public const string serviceIdentityUsernameForManagement = "ManagementClient";
    public const string serviceIdentityPasswordForManagement = "My Password/Key for ManagementClient";
    public const string serviceNamespace = "MyNameSpaceNoDots";
    public const string acsHostName = "accesscontrol.windows.net";
    public const string acsManagementServicesRelativeUrl = "v2/mgmt/service/";
    static string cachedSwtToken;
    

Passaggio 3: Aggiungere riferimenti ai servizi e agli assembly necessari

In questo passaggio vengono identificate e aggiunte le dipendenze richieste ai servizi e agli assembly.

Per aggiungere le dipendenze richieste ai servizi e agli assembly

  1. Fare clic con il pulsante destro del mouse su Riferimenti, scegliere Aggiungi riferimento e aggiungere un riferimento a System.Web.Extensions.

    Nota

    Può essere necessario fare clic con il pulsante destro del mouse sul nome dell'applicazione console di esempio in Esplora soluzioni, scegliere Proprietà e modificare il framework di destinazione dell'applicazione di esempio da .NET Framework 4 Client Profile (assegnato per impostazione predefinita quando si crea una nuova applicazione console) in .NET Framework 4.

  2. Fare clic con il pulsante destro del mouse su Riferimento al servizio, scegliere Aggiungi riferimento al servizio e 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, dove MyConsoleApplication è il nome dell'applicazione console e MyServiceReference è il nome del riferimento al servizio:

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Net;
    using System.Data.Services.Client;
    using System.Collections.Specialized;
    using System.Web.Script.Serialization;
    using System.Globalization;
    using System.Security.Cryptography;
    using System.Security.Cryptography.X509Certificates; 
    using MyConsoleApplication.MyServiceReference;
    

Passaggio 4: Implementare il client del servizio di gestione

In questo passaggio viene implementato il client del servizio di gestione.

Per implementare il client del servizio di gestione

  1. Aggiungere il metodo seguente alla classe Program :

       public static ManagementService CreateManagementServiceClient()
            {
                string managementServiceEndpoint = String.Format(CultureInfo.InvariantCulture, "https://{0}.{1}/{2}",
                    serviceNamespace,
                    acsHostName,
                    acsManagementServicesRelativeUrl);
                ManagementService managementService = new ManagementService(new Uri(managementServiceEndpoint));
    
                managementService.SendingRequest += GetTokenWithWritePermission;
    
                return managementService;
            }
    
  2. Aggiungere il metodo GetTokenWithWritePermission e i relativi metodi di supporto alla classe Program. GetTokenWithWritePermission e i relativi metodi di supporto aggiungono il token SWT OAuth 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, "Bearer " + cachedSwtToken);
            }
    
            private static string GetTokenFromACS()
            {
                //
                // Request a token from ACS
                //
                WebClient client = new WebClient();
                client.BaseAddress = string.Format(CultureInfo.CurrentCulture, 
                                                   "https://{0}.{1}", 
                                                   serviceNamespace, 
                                                   acsHostName);
    
                NameValueCollection values = new NameValueCollection();
                values.Add("grant_type", "client_credentials");
                values.Add("client_id", serviceIdentityUsernameForManagement);
                values.Add("client_secret", serviceIdentityPasswordForManagement);
                values.Add("scope", client.BaseAddress + acsManagementServicesRelativeUrl);
    
                byte[] responseBytes = client.UploadValues("/v2/OAuth2-13", "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 5 - Aggiungere certificati e chiavi

Aggiungere un certificato di firma del token per lo spazio dei nomi Controllo di accesso

In questo esempio viene creato un certificato di firma X.509 per lo spazio dei nomi Controllo di accesso.

Per aggiungere un certificato di firma del token per tutte le applicazioni relying party nello spazio dei nomi Controllo di accesso

  1. Inizializzare il client del servizio di gestione aggiungendo il seguente codice al metodo Main della classe Program:

    ManagementService svc = CreateManagementServiceClient();
    
  2. Creare una funzione helper ReadBytesFromPfxFile per leggere i byte dal certificato X.509 aggiungendo il codice seguente alla classe Program :

    //Helper function to read bytes from your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] signingCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        signingCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
                return signingCertificate;
            }
    
  3. Per aggiungere un certificato X.509 per la firma di token, aggiungere il codice seguente al metodo Main della classe Program:

    Nota

    Sostituire "Full path to your .PFX file" con il percorso completo valido del certificato X.509. Ad esempio, "C:\ ACS2ClientCertificate.pfx".

    Sostituire "MyCertificatePassword" con la password del certificato X.509.

    X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", “MyCertificatePassword”);
    
                DateTime startDate, endDate;
                startDate = cert.NotBefore.ToUniversalTime();
                endDate = cert.NotAfter.ToUniversalTime();
               string pfxFileName = @"Full path to your .PFX file";
                string pfxPassword = @"MyCertificatePassword";
    
    byte[] signingCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
    ServiceKey serviceKey = new ServiceKey()
                {
                    Type = "X509Certificate",
                    Usage = "Signing",
                    Value = signingCertificate,
                      Password = Encoding.UTF8.GetBytes("MyCertificatePassword"),
                      IsPrimary = false,
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
                svc.AddToServiceKeys(serviceKey);
                svc.SaveChanges(SaveChangesOptions.Batch);
    

Aggiungere un certificato per la firma di token per un'applicazione relying party

In questo esempio si crea un certificato di firma X.509 assegnato a una specifica applicazione relying party.

Come aggiungere un certificato per la firma di token per un'applicazione relying party

  1. Inizializzare il client del servizio di gestione aggiungendo il seguente codice al metodo Main della classe Program:

    ManagementService svc = CreateManagementServiceClient();
    
  2. Creare una funzione helper ReadBytesFromPfxFile per la lettura dei byte del certificato X.509 aggiungendo il seguente codice alla classe Program:

    //Helper function to read bytes from your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] signingCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        signingCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
                return signingCertificate;
            }
    
  3. Per aggiungere un certificato X.509 per la firma di token, aggiungere il codice seguente al metodo Main della classe Program:

    Nota

    Sostituire "Full path to your .PFX file" con il percorso completo del certificato X.509. Ad esempio, "C:\ ACS2ClientCertificate.pfx".

    Sostituire "MyCertificatePassword" con la password del certificato X.509.

    Sostituire "MyRelyingPartyApplication" con il nome dell'applicazione relying party.

    //Select an existing Relying Party Application by its name
    
                RelyingParty relyingParty = svc.RelyingParties.Where(m => m.Name == "MyRelyingPartyApplication").Single();
    
               // Add a signing certificate
    
               X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", "MyCertificatePassword");
               DateTime startDate, endDate;
               startDate = cert.NotBefore.ToUniversalTime();
               endDate = cert.NotAfter.ToUniversalTime();
    
               string pfxFileName = @"Full path to your .PFX file";
               string pfxPassword = "MyCertificatePassword";
    
                byte[] signingCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
               RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
                    StartDate = startDate.ToUniversalTime(),
                   EndDate = endDate.ToUniversalTime(),
                    Type = "X509Certificate",
                    Usage = "Signing",
                    IsPrimary = true,
                    Value = signingCertificate,
                   Password = Encoding.UTF8.GetBytes("MyCertificatePassword")
                };
    
    // Add the new signing certificate to the selected Relying Party Application
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
    
    
                //Save your relying party application
    
                svc.SaveChanges(SaveChangesOptions.Batch);
    

Aggiungere una chiave simmetrica di firma del token per lo spazio dei nomi Controllo di accesso

In questo esempio si assegna questa chiave simmetrica di firma allo spazio dei nomi Controllo di accesso.

Per aggiungere una chiave simmetrica di firma del token per lo spazio dei nomi Controllo di accesso

  1. Inizializzare il client del servizio di gestione aggiungendo il seguente codice al metodo Main della classe Program:

    ManagementService svc = CreateManagementServiceClient();
    
  2. Per aggiungere una chiave simmetrica per la firma di token, aggiungere il codice seguente al metodo Main della classe Program:

           string symKey = "SampleTokenSigningSymmetricKey";
                DateTime startDate, endDate;
                startDate = DateTime.UtcNow;
                endDate = DateTime.MaxValue;
    
                ServiceKey serviceKey = new ServiceKey()
                {
                    
                    Type = "Symmetric",
                    Usage = "Signing",
                    Value = Encoding.UTF8.GetBytes(symKey),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
                svc.AddToServiceKeys(serviceKey);
                svc.SaveChanges(SaveChangesOptions.Batch);
    

Aggiungere una chiave simmetrica per la firma di token per un'applicazione relying party

In questo esempio la nuova chiave simmetrica per la firma viene assegnata a una specifica applicazione relying party.

Per aggiungere una chiave simmetrica per la firma di token per un'applicazione relying party

  1. Inizializzare il client del servizio di gestione aggiungendo il seguente codice al metodo Main della classe Program:

    ManagementService svc = CreateManagementServiceClient();
    
  2. Per aggiungere una chiave simmetrica per la firma di token, aggiungere il codice seguente al metodo Main della classe Program:

          //Select a relying party application
    
                RelyingParty relyingParty = svc.RelyingParties.Where(m => m.Name == "MyRelyingPartyApplication").Single();
    
               // Create a symmetric key
    
                string symKey = "SampleTokenSigningSymmetricKey";
                DateTime startDate, endDate;
                startDate = DateTime.UtcNow;
                endDate = DateTime.MaxValue;
    
                RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
    
                    Type = "Symmetric",
                    Usage = "Signing",
                    Value = Encoding.UTF8.GetBytes(symKey),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
    
                //Assign this symmetric key to the selected relying party application 
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
                   //Save your symmetric key
    
                svc.SaveChanges(SaveChangesOptions.Batch);        
    

Aggiungere un certificato di crittografia dei token

In questo esempio si aggiunge un certificato X.509 di crittografia dei token per una specifica applicazione relying party.

Per aggiungere un certificato di crittografia dei token per un'applicazione relying party

  1. Inizializzare il client del servizio di gestione aggiungendo il seguente codice al metodo Main della classe Program:

    ManagementService svc = CreateManagementServiceClient();
    
  2. Per aggiungere un certificato X.509 di crittografia dei token, aggiungere il codice seguente al metodo Main della classe Program:

    Nota

    Sostituire "Full path to your .CER file" con il percorso completo di un certificato X.509. Ad esempio, "C:\ ACS2ClientCertificate.cer".

    Sostituire "MyCertificatePassword" con la password del certificato X.509.

    Sostituire "MyRelyingPartyApplication" con il nome di un'applicazione relying party.

    //Select a relying party application
    
                RelyingParty relyingParty = svc.RelyingParties.Where(m => m.Name == "MyRelyingPartyApplication").Single();
    
               // Add an encryption certificate
    
                X509Certificate2 cert = new X509Certificate2(@"Full path to your .CER file");
                DateTime startDate, endDate; 
                  startDate = cert.NotBefore;
                  endDate = cert.NotAfter;
    
                RelyingPartyKey relyingPartyKey = new RelyingPartyKey()
                {
                    Type = "X509Certificate",
                    Usage = "Encrypting",
                    Value = cert.GetRawCertData(),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
    
                //Assign this encryption certificate to the selected relying party application 
    
                svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey);
    
                   //Save your encryption certificate
    
                svc.SaveChanges(SaveChangesOptions.Batch);     
    

Aggiungere un certificato di decrittografia dei token

In questo esempio viene aggiunto un certificato di decrittografia del token X.509 assegnato allo spazio dei nomi Controllo di accesso.

Per aggiungere un certificato di firma del token per tutte le applicazioni di relying party nello spazio dei nomi Controllo di accesso

  1. Inizializzare il client del servizio di gestione aggiungendo il seguente codice al metodo Main della classe Program:

    ManagementService svc = CreateManagementServiceClient();
    
  2. Creare una funzione helper ReadBytesFromPfxFile per la lettura dei byte del certificato X.509 aggiungendo il seguente codice alla classe Program:

    //Helper function to read bytes from your .pfx file
    
            public static byte[] ReadBytesFromPfxFile(string pfxFileName, string protectionPassword)
            {
                byte[] decryptionCertificate;
                using (FileStream stream = File.OpenRead(pfxFileName))
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        decryptionCertificate = br.ReadBytes((int)stream.Length);
                    }
                }
                return decryptingCertificate;
            }
    
  3. Per aggiungere un certificato X.509 per la firma di token, aggiungere il codice seguente al metodo Main della classe Program:

    Nota

    Sostituire "Full path to your .PFX file" nel seguente codice con il percorso completo valido del certificato X.509. Ad esempio, se un certificato denominato ACS2ClientCertificate.pfx viene salvato in C:, il valore corretto è "C:\ ACS2ClientCertificate.pfx".

    Sostituire "MyCertificatePassword" nel seguente codice con la password corretta per il certificato X.509.

    X509Certificate2 cert = new X509Certificate2(@"Full path to your .PFX file", “MyCertificatePassword”);
    
                DateTime startDate, endDate;
                startDate = cert.NotBefore.ToUniversalTime();
                endDate = cert.NotAfter.ToUniversalTime();
               string pfxFileName = @"Full path to your .PFX file";
                string pfxPassword = @"MyCertificatePassword";
    
    byte[] decryptionCertificate = ReadBytesFromPfxFile(pfxFileName, pfxPassword);
    
    ServiceKey serviceKey = new ServiceKey()
                {
                    Type = "X509Certificate",
                    Usage = "Encrypting",
                    Value = decryptionCertificate,
                      Password = Encoding.UTF8.GetBytes("MyCertificatePassword"),
                    StartDate = startDate.ToUniversalTime(),
                    EndDate = endDate.ToUniversalTime()
                };
                svc.AddToServiceKeys(serviceKey);
                svc.SaveChanges(SaveChangesOptions.Batch);
    

Vedere anche

Concetti

Procedure di ACS