Procedura: Usare il servizio di gestione ACS per configurare le applicazioni relying party
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 applicazioni di relying party ACS usando il portale di gestione di ACS (per altre informazioni, vedere Relying Party Applications) o il servizio di gestione ACS. L'uso del servizio di gestione ACS può essere più efficiente se si sta creando un'interfaccia utente personalizzata per la gestione di ACS o se si vuole automatizzare l'onboarding di un nuovo tenant per soluzioni Software as a tenant multi-tenant (SaaS).
Procedura per la configurazione di applicazioni relying party mediante il servizio di gestione ACS
Importante
Prima di eseguire la procedura seguente, assicurarsi che il sistema soddisfi tutti i requisiti di .NET Framework e piattaforma riepilogati in Prerequisiti ACS.
Per configurare le applicazioni di relying party usando il servizio di gestione ACS, completare la procedura seguente:
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 – Aggiungere un'applicazione relying party
Passaggio 1 - Raccogliere le informazioni di configurazione di ACS
È possibile usare il portale di gestione di ACS per raccogliere le informazioni di configurazione necessarie. Per altre informazioni su come avviare il portale di gestione ACS, vedere ACS Management Portal.
Per raccogliere le informazioni di configurazione di ACS
Avviare il portale di gestione di ACS. Per altre informazioni su come avviare il portale di gestione ACS, vedere ACS Management Portal.
Ottenere il valore dell'account del servizio di gestione ACS. È possibile usare l'account predefinito ManagementClient. Per visualizzare questo valore, nel portale di gestione di ACS fare clic su Gestione servizio nella sezione Amministrazione nell'albero sul lato sinistro della pagina.
Ottenere il valore della password dell'account del servizio di gestione ACS. Per visualizzare questo valore, attenersi alla seguente procedura:
Nel portale di gestione di ACS fare clic su Servizio di gestione nella sezione Amministrazione nell'albero sul lato sinistro della pagina.
Nella pagina Management Service fare clic su ManagementClient in Management Service Accounts.
Nella pagina Edit Management Service Account in Credentials fare clic su Password.
Nella pagina Edit Management Credential copiare il valore nel campo Password.
Ottenere il nome dello spazio dei nomi di Azure. È possibile ottenere questo valore dall'portale di Azure o dall'URL del portale di gestione ACS. Ad esempio, in http://contoso.accesscontrol.windows.net, il nome dello spazio dei nomi è contoso.
Ottenere il nome host ACS. In genere, questo valore è accesscontrol.windows.net.
Passaggio 2 - Creare un'applicazione console di esempio
In questo passaggio si crea un'applicazione console di esempio che può eseguire il codice per aggiungere i gruppi di regole e le regole ACS.
Per creare un'applicazione console di esempio
Aprire Visual Studio 2012 e creare un nuovo progetto di applicazione console nel modello installato Windows.
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
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.
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
Aggiungere le dichiarazioni riportate di seguito, dove MyConsoleApplication è il nome dell'applicazione console:
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
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; }
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 un'applicazione relying party
In questo passaggio si crea un'applicazione di relying party di esempio con un formato token SAML 2.0 (opzione predefinita), nessun criterio di crittografia token (opzione predefinita), associato a un provider di identità di Windows Live ID (account Microsoft) (opzione predefinita), 600 secondi di durata del token (opzione predefinita) e un certificato di firma token personalizzato X.509 per l'applicazione relying party o un certificato di firma token per l'opzione predefinita Controllo di accesso spazio dei nomi.
Per aggiungere un'applicazione relying party con un certificato di firma del token dello spazio dei nomi Controllo di accesso
Inizializzare il client del servizio di gestione aggiungendo il seguente codice al metodo Main della classe Program:
ManagementService svc = CreateManagementServiceClient();
Aggiungere la nuova applicazione relying party, alla quale è possibile assegnare il nome "MyRelyingPartyApplication" come mostrato nel seguente codice, e salvare le modifiche aggiungendo il seguente codice 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.cer viene salvato in C:, il valore corretto è "C:\ ACS2ClientCertificate.cer".
Sostituire "MyCertificatePassword" nel seguente codice con la password corretta per il certificato X.509.//Create Relying Party Application RelyingParty relyingParty = new RelyingParty() { Name = "MyRelyingPartyApplication", AsymmetricTokenEncryptionRequired = false, TokenType = "SAML_2_0", TokenLifetime = 3600 }; svc.AddToRelyingParties(relyingParty); //Create the Realm Address RelyingPartyAddress realmAddress = new RelyingPartyAddress() { Address = "http://TestRelyingParty.com/Realm", EndpointType = "Realm" }; svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", realmAddress); //Create the Return URL Address RelyingPartyAddress replyAddress = new RelyingPartyAddress() { Address = "http://TestRelyingParty.com/Reply", EndpointType = "Reply" }; svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", replyAddress); // Create a Rule Group for This Relying Party Application RuleGroup rg = new RuleGroup(); rg.Name = "SampleRuleGroup For " + relyingParty.Name; svc.AddToRuleGroups(rg); // Assign This New Rule Group to Your New Relying Party Application RelyingPartyRuleGroup relyingPartyRuleGroup = new RelyingPartyRuleGroup(); svc.AddToRelyingPartyRuleGroups(relyingPartyRuleGroup); svc.AddLink(relyingParty, "RelyingPartyRuleGroups", relyingPartyRuleGroup); svc.AddLink(rg, "RelyingPartyRuleGroups", relyingPartyRuleGroup); //Save Your New Relying Party Application svc.SaveChanges(SaveChangesOptions.Batch);
Per aggiungere un'applicazione relying party con un certificato di firma dei token dedicato
Inizializzare il client del servizio di gestione aggiungendo il seguente codice al metodo Main della classe Program:
ManagementService svc = CreateManagementServiceClient();
Creare una funzione helper ReadBytesFromPfxFile per leggere 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; }
Aggiungere la nuova applicazione relying party, alla quale è possibile assegnare il nome "MyRelyingPartyApplication" come mostrato nel seguente codice, e salvare le modifiche aggiungendo il seguente codice 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.cer viene salvato in C:, il valore corretto è "C:\ ACS2ClientCertificate.cer".
Sostituire "MyCertificatePassword" nel seguente codice con la password corretta per il certificato X.509.//Create Relying Party Application RelyingParty relyingParty = new RelyingParty() { Name = "MyRelyingPartyApplication", AsymmetricTokenEncryptionRequired = false, TokenType = "SAML_2_0", TokenLifetime = 3600 }; svc.AddToRelyingParties(relyingParty); //Create the Realm Address RelyingPartyAddress realmAddress = new RelyingPartyAddress() { Address = "http://TestRelyingParty.com/Realm", EndpointType = "Realm" }; svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", realmAddress); //Create the Return URL Address RelyingPartyAddress replyAddress = new RelyingPartyAddress() { Address = "http://TestRelyingParty.com/Reply", EndpointType = "Reply" }; svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", replyAddress); //Create 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") }; svc.AddRelatedObject(relyingParty, "RelyingPartyKeys", relyingPartyKey); // Create a Rule Group for This Relying Party Application RuleGroup rg = new RuleGroup(); rg.Name = "SampleRuleGroup For " + relyingParty.Name; svc.AddToRuleGroups(rg); // Assign This New Rule Group to Your New Relying Party Application RelyingPartyRuleGroup relyingPartyRuleGroup = new RelyingPartyRuleGroup(); svc.AddToRelyingPartyRuleGroups(relyingPartyRuleGroup); svc.AddLink(relyingParty, "RelyingPartyRuleGroups", relyingPartyRuleGroup); svc.AddLink(rg, "RelyingPartyRuleGroups", relyingPartyRuleGroup); //Save Your New Relying Party Application svc.SaveChanges(SaveChangesOptions.Batch);