Usare l'API di autenticazione di Resource Manager per accedere alle sottoscrizioniUse Resource Manager authentication API to access subscriptions

IntroduzioneIntroduction

Questo articolo illustra agli sviluppatori software, che devono creare un'app per gestire le risorse di Azure di un cliente, come eseguire l'autenticazione con le API di Azure Resource Manager e ottenere l'accesso alle risorse in altre sottoscrizioni.If you are a software developer who needs to create an app that manages a customer's Azure resources, this article shows you how to authenticate with the Azure Resource Manager APIs and gain access to resources in other subscriptions.

L'app può accedere alle API di Resource Manager in due modi:Your app can access the Resource Manager APIs in couple of ways:

  1. Accesso utente + app: per le app che accedono alle risorse per conto di un utente connesso.User + app access: for apps that access resources on behalf of a signed-in user. Questo approccio funziona per le app, ad esempio le app Web e gli strumenti da riga di comando, che trattano solo la "gestione interattiva" delle risorse di Azure.This approach works for apps, such as web apps and command-line tools, that deal with only "interactive management" of Azure resources.
  2. Accesso solo app: per le app che eseguono servizi daemon e processi pianificati.App-only access: for apps that run daemon services and scheduled jobs. All'identità dell'app viene concesso l'accesso diretto alle risorse.The app's identity is granted direct access to the resources. Questo approccio funziona per le app che richiedono l'accesso headless (automatico) a lungo termine ad Azure.This approach works for apps that need long-term headless (unattended) access to Azure.

Questo articolo include istruzioni dettagliate per la creazione di un'app che usa entrambi i metodi di autorizzazione.This article provides step-by-step instructions to create an app that employs both these authorization methods. Illustra come eseguire ogni passaggio con l'API REST o C#.It shows how to perform each step with REST API or C#. L'applicazione ASP.NET MVC completa è disponibile all'indirizzo https://github.com/dushyantgill/VipSwapper/tree/master/CloudSense.The complete ASP.NET MVC application is available at https://github.com/dushyantgill/VipSwapper/tree/master/CloudSense.

Operazioni eseguite dall'app WebWhat the web app does

L'app Web:The web app:

  1. Esegue l'accesso per un utente di Azure.Signs-in an Azure user.
  2. Chiede all'utente di concedere a Resource Manager l'accesso all'app Web.Asks user to grant the web app access to Resource Manager.
  3. Ottiene il token di accesso app + utente per l'accesso a Resource Manager.Gets user + app access token for accessing Resource Manager.
  4. Usa il token (ottenuto nel passaggio 3) per assegnare un'entità servizio dell'app a un ruolo nella sottoscrizione.Uses token (from step 3) to assign the app's service principal to a role in the subscription. Questo passaggio consente all'app un accesso a lungo termine alla sottoscrizione.This step gives the app long-term access to the subscription.
  5. Ottiene il token di accesso solo app.Gets app-only access token.
  6. Usa il token (ottenuto nel passaggio 5) per gestire le risorse nella sottoscrizione tramite Resource Manager.Uses token (from step 5) to manage resources in the subscription through Resource Manager.

Ecco il flusso dell'applicazione Web.Here's the flow of the web application.

Flusso di autenticazione di Resource Manager

L'utente fornisce l'ID sottoscrizione per la sottoscrizione che vuole usare:As a user, you provide the subscription ID for the subscription you want to use:

Fornire l'ID sottoscrizione

Selezionare l'account da usare per l'accesso.Select the account to use for logging in.

Selezionare un account

Fornire le credenziali.Provide your credentials.

Fornire le credenziali

Concedere all'app l'accesso alle sottoscrizioni di Azure:Grant the app access to your Azure subscriptions:

Concedere l'accesso

Gestire le sottoscrizioni connesse:Manage your connected subscriptions:

Connettere la sottoscrizione

Registrare l'applicazioneRegister application

Prima di iniziare a scrivere codice, registrare l'app Web in Azure Active Directory (AD).Before you start coding, register your web app with Azure Active Directory (AD). La registrazione dell'app crea un'identità centrale per l'app in Azure AD,The app registration creates a central identity for your app in Azure AD. che contiene le informazioni di base sull'applicazione, ad esempio l'ID client OAuth, gli URL di risposta e le credenziali che l'applicazione usa per l'autenticazione e l'accesso alle API di Azure Resource Manager.It holds basic information about your application like OAuth Client ID, Reply URLs, and credentials that your application uses to authenticate and access Azure Resource Manager APIs. Con la registrazione dell'app vengono registrate anche le diverse autorizzazioni delegate richieste dall'applicazione quando accede alle API Microsoft per conto dell'utente.The app registration also records the various delegated permissions that your application needs when accessing Microsoft APIs on behalf of the user.

Poiché l'applicazione accede ad altre sottoscrizioni, è necessario configurarla come un'applicazione multi-tenant.Because your app accesses other subscription, you must configure it as a multi-tenant application. Per superare la convalida, fornire un dominio associato ad Azure Active Directory.To pass validation, provide a domain associated with your Azure Active Directory. Per esaminare i domini associati ad Azure Active Directory, accedere al portale.To see the domains associated with your Azure Active Directory, log in to the portal.

L'esempio seguente mostra come registrare l'app usando Azure PowerShell.The following example shows how to register the app by using Azure PowerShell. Per il funzionamento di questo comando, è necessaria la versione più recente (agosto 2016) di Azure PowerShell.You must have the latest version (August 2016) of Azure PowerShell for this command to work.

$app = New-AzureRmADApplication -DisplayName "{app name}" -HomePage "https://{your domain}/{app name}" -IdentifierUris "https://{your domain}/{app name}" -Password "{your password}" -AvailableToOtherTenants $true

Per accedere come applicazione Active Directory, sono necessari l'ID applicazione e la password.To log in as the AD application, you need the application ID and password. Per visualizzare l'ID applicazione restituito dal comando precedente, usare:To see the application ID that is returned from the previous command, use:

$app.ApplicationId

L'esempio seguente mostra come registrare l'app usando l'interfaccia della riga di comando di Azure.The following example shows how to register the app by using Azure CLI.

azure ad app create --name {app name} --home-page https://{your domain}/{app name} --identifier-uris https://{your domain}/{app name} --password {your password} --available true

I risultati includono l'AppId necessario per autenticarsi come applicazione.The results include the AppId, which you need when authenticating as the application.

Configurazione facoltativa: credenziali del certificatoOptional configuration - certificate credential

Azure AD supporta anche le credenziali certificato per le applicazioni: creare un certificato autofirmato, mantenere la chiave privata e aggiungere la chiave pubblica alla registrazione dell'applicazione Azure AD.Azure AD also supports certificate credentials for applications: you create a self-signed cert, keep the private key, and add the public key to your Azure AD application registration. Per l'autenticazione, l'applicazione invia un piccolo payload ad Azure AD firmato usando la chiave privata e Azure AD convalida la firma usando la chiave pubblica registrata.For authentication, your application sends a small payload to Azure AD signed using your private key, and Azure AD validates the signature using the public key that you registered.

Per informazioni sulla creazione di un'app Active Directory con un certificato, vedere Use Azure PowerShell to create a service principal to access resources (Usare Azure PowerShell per creare un'entità servizio per accedere alle risorse) o Use Azure CLI to create a service principal to access resources (Usare l'interfaccia della riga di comando di Azure per creare un'entità servizio per accedere alle risorse).For information about creating an AD app with a certificate, see Use Azure PowerShell to create a service principal to access resources or Use Azure CLI to create a service principal to access resources.

Ottenere l'ID tenant dall'ID sottoscrizioneGet tenant ID from subscription ID

Per richiedere un token da usare per chiamare Resource Manager, l'applicazione deve conoscere l'ID tenant del tenant di Azure AD che ospita la sottoscrizione di Azure.To request a token that can be used to call Resource Manager, your application needs to know the tenant ID of the Azure AD tenant that hosts the Azure subscription. Molto probabilmente gli utenti conoscono i relativi ID sottoscrizione, ma potrebbero non conoscere gli ID tenant per Azure Active Directory.Most likely, your users know their subscription IDs, but they might not know their tenant IDs for Azure Active Directory. Per ottenere l'ID tenant dell'utente, chiedere all'utente l'ID sottoscrizione.To get the user's tenant ID, ask the user for the subscription ID. Fornire questo ID sottoscrizione quando si invia una richiesta relativa alla sottoscrizione:Provide that subscription ID when sending a request about the subscription:

https://management.azure.com/subscriptions/{subscription-id}?api-version=2015-01-01

La richiesta non riesce perché l'utente non è ancora connesso, ma è possibile recuperare l'ID tenant dalla risposta.The request fails because the user has not logged in yet, but you can retrieve the tenant ID from the response. Nel caso di eccezione, recuperare l'ID tenant dal valore dell'intestazione della risposta per WWW-Authenticate.In that exception, retrieve the tenant ID from the response header value for WWW-Authenticate. Questa implementazione è visibile nel metodo GetDirectoryForSubscription .You see this implementation in the GetDirectoryForSubscription method.

Ottenere il token di accesso utente + appGet user + app access token

L'applicazione reindirizza l'utente ad Azure AD con una richiesta di autorizzazione OAuth 2.0 per autenticare le credenziali dell'utente e ricevere un codice di autorizzazione.Your application redirects the user to Azure AD with an OAuth 2.0 Authorize Request - to authenticate the user's credentials and get back an authorization code. L'applicazione usa il codice di autorizzazione per ottenere un token di accesso per Resource Manager.Your application uses the authorization code to get an access token for Resource Manager. Il metodo ConnectSubscription consente di creare la richiesta di autorizzazione.The ConnectSubscription method creates the authorization request.

Questo articolo descrive le richieste dell'API REST per autenticare l'utente.This article shows the REST API requests to authenticate the user. È anche possibile usare librerie helper per eseguire l'autenticazione nel codice.You can also use helper libraries to perform authentication in your code. Per altre informazioni su queste librerie, vedere Azure Active Directory Authentication Library (Libreria di autenticazione di Azure Active Directory).For more information about these libraries, see Azure Active Directory Authentication Libraries. Per informazioni aggiuntive su come integrare la gestione delle identità in un'applicazione, vedere Guida per gli sviluppatori di Azure Active Directory.For guidance on integrating identity management in an application, see Azure Active Directory developer's guide.

Richiesta di autorizzazione (OAuth 2.0)Auth request (OAuth 2.0)

Rilasciare una richiesta di autorizzazione Open ID Connect/OAuth2.0 all'endpoint di autorizzazione di Azure AD:Issue an Open ID Connect/OAuth2.0 Authorize Request to the Azure AD Authorize endpoint:

https://login.microsoftonline.com/{tenant-id}/OAuth2/Authorize

I parametri della stringa di query disponibili per questa richiesta sono descritti nell'articolo su come richiedere un codice di autorizzazione.The query string parameters that are available for this request are described in the request an authorization code article.

L'esempio seguente illustra come richiedere l'autorizzazione OAuth 2.0:The following example shows how to request OAuth2.0 authorization:

https://login.microsoftonline.com/{tenant-id}/OAuth2/Authorize?client_id=a0448380-c346-4f9f-b897-c18733de9394&response_mode=query&response_type=code&redirect_uri=http%3a%2f%2fwww.vipswapper.com%2fcloudsense%2fAccount%2fSignIn&resource=https%3a%2f%2fgraph.windows.net%2f&domain_hint=live.com

Azure AD autentica l'utente e, se necessario, chiede all'utente di concedere l'autorizzazione all'app.Azure AD authenticates the user, and, if necessary, asks the user to grant permission to the app. Restituisce il codice di autorizzazione all'URL di risposta dell'applicazione.It returns the authorization code to the Reply URL of your application. A seconda della response_mode richiesta, Azure AD invia i dati nella stringa di query o come dati di post.Depending on the requested response_mode, Azure AD either sends back the data in query string or as post data.

code=AAABAAAAiL****FDMZBUwZ8eCAA&session_state=2d16bbce-d5d1-443f-acdf-75f6b0ce8850

Richiesta di autorizzazione (Open ID Connect)Auth request (Open ID Connect)

Se non si vuole solo accedere ad Azure Resource Manager per conto dell'utente, ma anche consentire all'utente di accedere all'applicazione usando l'account Azure AD, inviare una richiesta di autorizzazione OpenID Connect.If you not only wish to access Azure Resource Manager on behalf of the user, but also allow the user to sign in to your application using their Azure AD account, issue an Open ID Connect Authorize Request. Con OpenID Connect l'applicazione riceve anche un id_token da Azure AD, che può essere usato dall'app per consentire l'accesso dell'utente.With Open ID Connect, your application also receives an id_token from Azure AD that your app can use to sign in the user.

I parametri della stringa di query disponibili per questa richiesta sono descritti nell'articolo su come inviare la richiesta di accesso.The query string parameters that are available for this request are described in the Send the sign-in request article.

Una richiesta Open ID Connect di esempio è:An example Open ID Connect request is:

 https://login.microsoftonline.com/{tenant-id}/OAuth2/Authorize?client_id=a0448380-c346-4f9f-b897-c18733de9394&response_mode=form_post&response_type=code+id_token&redirect_uri=http%3a%2f%2fwww.vipswapper.com%2fcloudsense%2fAccount%2fSignIn&resource=https%3a%2f%2fgraph.windows.net%2f&scope=openid+profile&nonce=63567Dc4MDAw&domain_hint=live.com&state=M_12tMyKaM8

Azure AD autentica l'utente e, se necessario, chiede all'utente di concedere l'autorizzazione all'app.Azure AD authenticates the user, and, if necessary, asks the user to grant permission to the app. Restituisce il codice di autorizzazione all'URL di risposta dell'applicazione.It returns the authorization code to the Reply URL of your application. A seconda della response_mode richiesta, Azure AD invia i dati nella stringa di query o come dati di post.Depending on the requested response_mode, Azure AD either sends back the data in query string or as post data.

Una risposta Open ID Connect di esempio è:An example Open ID Connect response is:

code=AAABAAAAiL*****I4rDWd7zXsH6WUjlkIEQxIAA&id_token=eyJ0eXAiOiJKV1Q*****T3GrzzSFxg&state=M_12tMyKaM8&session_state=2d16bbce-d5d1-443f-acdf-75f6b0ce8850

Richiesta di token (flusso di concessione del codice OAuth 2.0)Token request (OAuth2.0 Code Grant Flow)

Ora che l'applicazione ha ricevuto il codice di autorizzazione da Azure AD, è possibile ottenere il token di accesso per Azure Resource Manager.Now that your application has received the authorization code from Azure AD, it is time to get the access token for Azure Resource Manager. Inserire una richiesta di token di concessione del codice OAuth2.0 nell'endpoint del token di Azure AD:Post an OAuth2.0 Code Grant Token Request to the Azure AD Token endpoint:

https://login.microsoftonline.com/{tenant-id}/OAuth2/Token

I parametri della stringa di query disponibili per questa richiesta sono descritti nell'articolo su come usare un codice di autorizzazione.The query string parameters that are available for this request are described in the use the authorization code article.

L'esempio seguente illustra una richiesta per un token di concessione del codice con la credenziale password:The following example shows a request for code grant token with password credential:

POST https://login.microsoftonline.com/7fe877e6-a150-4992-bbfe-f517e304dfa0/oauth2/token HTTP/1.1

Content-Type: application/x-www-form-urlencoded
Content-Length: 1012

grant_type=authorization_code&code=AAABAAAAiL9Kn2Z*****L1nVMH3Z5ESiAA&redirect_uri=http%3A%2F%2Flocalhost%3A62080%2FAccount%2FSignIn&client_id=a0448380-c346-4f9f-b897-c18733de9394&client_secret=olna84E8*****goScOg%3D

Quando si usano le credenziali certificato, creare un token Web JSON (JWT) e una firma (RSA SHA256) usando la chiave privata della credenziale certificato dell'applicazione.When working with certificate credentials, create a JSON Web Token (JWT) and sign (RSA SHA256) using the private key of your application's certificate credential. I tipi di attestazione per il token sono illustrati nell'argomento sulle attestazioni nei token JWT.The claim types for the token are shown in JWT token claims. Come riferimento, vedere Active Directory Auth Library (.NET) code (Codice di Active Directory Authentication Library - .NET) per firmare i token JWT per l'asserzione client.For reference, see the Active Directory Auth Library (.NET) code to sign Client Assertion JWT tokens.

Per dettagli sull'autenticazione client, vedere la specifica di OpenID Connect .See the Open ID Connect spec for details on client authentication.

L'esempio seguente illustra una richiesta per un token di concessione del codice con la credenziale certificato:The following example shows a request for code grant token with certificate credential:

POST https://login.microsoftonline.com/7fe877e6-a150-4992-bbfe-f517e304dfa0/oauth2/token HTTP/1.1

Content-Type: application/x-www-form-urlencoded
Content-Length: 1012

grant_type=authorization_code&code=AAABAAAAiL9Kn2Z*****L1nVMH3Z5ESiAA&redirect_uri=http%3A%2F%2Flocalhost%3A62080%2FAccount%2FSignIn&client_id=a0448380-c346-4f9f-b897-c18733de9394&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&client_assertion=eyJhbG*****Y9cYo8nEjMyA

Risposta di esempio per il token di concessione del codice:An example response for code grant token:

HTTP/1.1 200 OK

{"token_type":"Bearer","expires_in":"3599","expires_on":"1432039858","not_before":"1432035958","resource":"https://management.core.windows.net/","access_token":"eyJ0eXAiOiJKV1Q****M7Cw6JWtfY2lGc5A","refresh_token":"AAABAAAAiL9Kn2Z****55j-sjnyYgAA","scope":"user_impersonation","id_token":"eyJ0eXAiOiJKV*****-drP1J3P-HnHi9Rr46kGZnukEBH4dsg"}

Gestire la risposta del token di concessione del codiceHandle code grant token response

Una risposta del token riuscita contiene il token di accesso (utente + app) per Azure Resource Manager.A successful token response contains the (user + app) access token for Azure Resource Manager. L'applicazione usa questo token di accesso per accedere a Resource Manager per conto dell'utente.Your application uses this access token to access Resource Manager on behalf of the user. La durata dei token di accesso rilasciati da Azure AD è di un'ora.The lifetime of access tokens issued by Azure AD is one hour. È improbabile che l'applicazione Web debba rinnovare il token di accesso (utente + app).It is unlikely that your web application needs to renew the (user + app) access token. Se è necessario rinnovare il token di accesso, usare il token di aggiornamento ricevuto dall'applicazione nella risposta del token.If it needs to renew the access token, use the refresh token that your application receives in the token response. Inserire una richiesta di token OAuth2.0 nell'endpoint del token di Azure AD:Post an OAuth2.0 Token Request to the Azure AD Token endpoint:

https://login.microsoftonline.com/{tenant-id}/OAuth2/Token

I parametri da usare con la richiesta di aggiornamento sono descritti nell'articolo su come aggiornare i token di accesso.The parameters to use with the refresh request are described in refreshing the access token.

L'esempio seguente mostra come usare il token di aggiornamento:The following example shows how to use the refresh token:

POST https://login.microsoftonline.com/7fe877e6-a150-4992-bbfe-f517e304dfa0/oauth2/token HTTP/1.1

Content-Type: application/x-www-form-urlencoded
Content-Length: 1012

grant_type=refresh_token&refresh_token=AAABAAAAiL9Kn2Z****55j-sjnyYgAA&client_id=a0448380-c346-4f9f-b897-c18733de9394&client_secret=olna84E8*****goScOg%3D

Anche se i token di aggiornamento possono essere usati per ottenere nuovi token di accesso per Azure Resource Manager, non sono adatti per l'accesso offline dell'applicazione.Although refresh tokens can be used to get new access tokens for Azure Resource Manager, they are not suitable for offline access by your application. La durata dei token di aggiornamento è limitata e i token di aggiornamento sono associati all'utente.The refresh tokens lifetime is limited, and refresh tokens are bound to the user. Se l'utente lascia l'organizzazione, l'applicazione che usa il token di aggiornamento perde l'accesso.If the user leaves the organization, the application using the refresh token loses access. Questo approccio non è adatto per le applicazioni usate dai team per gestire le risorse di Azure.This approach isn't suitable for applications that are used by teams to manage their Azure resources.

Verificare se l'utente può assegnare l'accesso alla sottoscrizioneCheck if user can assign access to subscription

L'applicazione ora ha un token per accedere ad Azure Resource Manager per conto dell'utente.Your application now has a token to access Azure Resource Manager on behalf of the user. Nel passaggio successivo si connette l'app alla sottoscrizione.The next step is to connect your app to the subscription. Dopo la connessione, l'app può gestire le sottoscrizioni anche quando l'utente non è presente (accesso offline a lungo termine).After connecting, your app can manage those subscriptions even when the user isn't present (long-term offline access).

Per ogni sottoscrizione da connettere, chiamare l'API di Resource Manager per elencare le autorizzazioni per determinare se all'utente sono concessi i diritti di gestione degli accessi per la sottoscrizione.For each subscription to connect, call the Resource Manager list permissions API to determine whether the user has access management rights for the subscription.

Il metodo UserCanManagerAccessForSubscription dell'app di esempio ASP.NET MVC implementa questa chiamata.The UserCanManagerAccessForSubscription method of the ASP.NET MVC sample app implements this call.

L'esempio seguente illustra come richiedere le autorizzazioni di un utente per una sottoscrizione.The following example shows how to request a user's permissions on a subscription. 83cfe939-2402-4581-b761-4f59b0a041e4 è l'ID della sottoscrizione.83cfe939-2402-4581-b761-4f59b0a041e4 is the ID of the subscription.

GET https://management.azure.com/subscriptions/83cfe939-2402-4581-b761-4f59b0a041e4/providers/microsoft.authorization/permissions?api-version=2015-07-01 HTTP/1.1

Authorization: Bearer eyJ0eXAiOiJKV1QiLC***lwO1mM7Cw6JWtfY2lGc5A

Ecco un esempio della risposta per ottenere le autorizzazioni di un utente per la sottoscrizione:An example of the response to get user's permissions on subscription is:

HTTP/1.1 200 OK

{"value":[{"actions":["*"],"notActions":["Microsoft.Authorization/*/Write","Microsoft.Authorization/*/Delete"]},{"actions":["*/read"],"notActions":[]}]}

L'API per le autorizzazioni restituisce più autorizzazioni.The permissions API returns multiple permissions. Ogni autorizzazione è costituita dalle azioni consentite (actions) e dalle azioni non consentite (notactions).Each permission consists of allowed actions (actions) and disallowed actions (notactions). Se un'azione è presente nell'elenco di azioni consentite di un'autorizzazione e non è presente nelle azioni non consentite di tale autorizzazione, all'utente è consentito eseguire tale azione.If an action is present in the allowed actions of any permission and not present in the disallowed actions of that permission, the user is allowed to perform that action. microsoft.authorization/roleassignments/write è l'azione che concede i diritti di gestione degli accessi.microsoft.authorization/roleassignments/write is the action that that grants access management rights. L'applicazione deve analizzare il risultato delle autorizzazioni per cercare una corrispondenza regex nella stringa di questa azione negli elenchi actions e notactions di ogni autorizzazione.Your application must parse the permissions result to look for a regex match on this action string in the actions and notactions of each permission.

Ottenere il token di accesso solo appGet app-only access token

A questo punto, si sa se l'utente può assegnare l'accesso alla sottoscrizione di Azure.Now, you know if the user can assign access to the Azure subscription. Ecco i passaggi successivi:The next steps are:

  1. Assegnare il ruolo Controllo degli accessi in base al ruolo appropriato all'identità dell'applicazione nella sottoscrizione.Assign the appropriate RBAC role to your application's identity on the subscription.
  2. Convalidare l'assegnazione dell'accesso eseguendo una query per l'autorizzazione dell'applicazione nella sottoscrizione o accedendo a Resource Manager con il token solo app.Validate the access assignment by querying for the application's permission on the subscription or by accessing Resource Manager using app-only token.
  3. Registrare la connessione nella struttura dei dati delle "sottoscrizioni connesse" dell'applicazione, rendendo persistente l'ID della sottoscrizione.Record the connection in your applications "connected subscriptions" data structure - persisting the ID of the subscription.

Ora verrà esaminato più dettagliatamente il primo passaggio.Let's look closer at the first step. Per assegnare il ruolo Controllo degli accessi in base al ruolo appropriato all'identità dell'applicazione, è necessario determinare:To assign the appropriate RBAC role to the application's identity, you must determine:

  • L'ID oggetto dell'identità dell'applicazione nella directory Azure Active Directory dell'utenteThe object ID of your application's identity in the user's Azure Active Directory
  • L'identificatore del ruolo Controllo degli accessi in base al ruolo che l'applicazione richiede nella sottoscrizioneThe identifier of the RBAC role that your application requires on the subscription

Quando l'applicazione autentica un utente da un'istanza di Azure AD, crea un oggetto entità servizio per l'applicazione in tale istanza di Azure AD.When your application authenticates a user from an Azure AD, it creates a service principal object for your application in that Azure AD. Azure consente di assegnare alle entità servizio i ruoli Controllo degli accessi in base al ruolo, per concedere l'accesso diretto alle applicazioni corrispondenti nelle risorse di Azure.Azure allows RBAC roles to be assigned to service principals to grant direct access to corresponding applications on Azure resources. Questa azione è esattamente ciò che si vuole eseguire.This action is exactly what you wish to do. Eseguire una query sull'API Graph di Azure AD per determinare l'identificatore dell'entità servizio dell'applicazione nell'istanza di Azure AD dell'utente connesso.Query the Azure AD Graph API to determine the identifier of the service principal of your application in the signed-in user's Azure AD.

Si ha un solo token di accesso per Azure Resource Manager ed è necessario un nuovo token di accesso per chiamare l'API Graph di Azure AD.You only have an access token for Azure Resource Manager - you need a new access token to call the Azure AD Graph API. Ogni applicazione in Azure AD ha le autorizzazioni per eseguire query sul proprio oggetto entità servizio, quindi un token di accesso solo app sarà sufficiente.Every application in Azure AD has permission to query its own service principal object, so an app-only access token is sufficient.

Ottenere il token di accesso solo app per l'API Graph di Azure ADGet app-only access token for Azure AD Graph API

Per autenticare l'app e ottenere un token per l'API Graph di Azure AD, rilasciare una richiesta del token di flusso OAuth2.0 per la concessione delle credenziali client per l'endpoint del token di Azure AD (http://login.microsoftonline.com/{directory_domain_name}/OAuth2/Token).To authenticate your app and get a token to Azure AD Graph API, issue a Client Credential Grant OAuth2.0 flow token request to Azure AD token endpoint (https://login.microsoftonline.com/{directory_domain_name}/OAuth2/Token).

Il metodo GetObjectIdOfServicePrincipalInOrganization dell'applicazione di esempio ASP.NET MVC ottiene un token di accesso solo app per l'API Graph usando Active Directory Authentication Library per .NET.The GetObjectIdOfServicePrincipalInOrganization method of the ASP.net MVC sample application gets an app-only access token for Graph API using the Active Directory Authentication Library for .NET.

I parametri della stringa di query disponibili per questa richiesta sono descritti nell'articolo su come richiedere un token di accesso.The query string parameters that are available for this request are described in the Request an Access Token article.

Richiesta di esempio del token di concessione delle credenziali client:An example request for client credential grant token:

POST https://login.microsoftonline.com/62e173e9-301e-423e-bcd4-29121ec1aa24/oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 187</pre>
<pre>grant_type=client_credentials&client_id=a0448380-c346-4f9f-b897-c18733de9394&resource=https%3A%2F%2Fgraph.windows.net%2F &client_secret=olna8C*****Og%3D

Risposta di esempio del token di concessione delle credenziali client:An example response for client credential grant token:

HTTP/1.1 200 OK

{"token_type":"Bearer","expires_in":"3599","expires_on":"1432039862","not_before":"1432035962","resource":"https://graph.windows.net/","access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSIsImtpZCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSJ9.eyJhdWQiOiJodHRwczovL2dyYXBoLndpbmRv****G5gUTV-kKorR-pg"}

Ottenere l'ObjectId dell'entità servizio dell'applicazione nella directory Azure AD dell'utenteGet ObjectId of application service principal in user Azure AD

Ora usare il token di accesso solo app per eseguire una query sull'API dell'entità servizio Azure AD Graph per determinare l'ID oggetto dell'entità servizio dell'applicazione nella directory.Now, use the app-only access token to query the Azure AD Graph Service Principals API to determine the Object ID of the application's service principal in the directory.

Il metodo GetObjectIdOfServicePrincipalInOrganization dell'applicazione di esempio ASP.NET MVC implementa questa chiamata.The GetObjectIdOfServicePrincipalInOrganization method of the ASP.net MVC sample application implements this call.

L'esempio seguente illustra come richiedere l'entità servizio di un'applicazione.The following example shows how to request an application's service principal. a0448380-c346-4f9f-b897-c18733de9394 è l'ID client dell'applicazione.a0448380-c346-4f9f-b897-c18733de9394 is the client ID of the application.

GET https://graph.windows.net/62e173e9-301e-423e-bcd4-29121ec1aa24/servicePrincipals?api-version=1.5&$filter=appId%20eq%20'a0448380-c346-4f9f-b897-c18733de9394' HTTP/1.1

Authorization: Bearer eyJ0eXAiOiJK*****-kKorR-pg

L'esempio seguente illustra una risposta alla richiesta per l'entità servizio di un'applicazioneThe following example shows a response to the request for an application's service principal

HTTP/1.1 200 OK

{"odata.metadata":"https://graph.windows.net/62e173e9-301e-423e-bcd4-29121ec1aa24/$metadata#directoryObjects/Microsoft.DirectoryServices.ServicePrincipal","value":[{"odata.type":"Microsoft.DirectoryServices.ServicePrincipal","objectType":"ServicePrincipal","objectId":"9b5018d4-6951-42ed-8a92-f11ec283ccec","deletionTimestamp":null,"accountEnabled":true,"appDisplayName":"CloudSense","appId":"a0448380-c346-4f9f-b897-c18733de9394","appOwnerTenantId":"62e173e9-301e-423e-bcd4-29121ec1aa24","appRoleAssignmentRequired":false,"appRoles":[],"displayName":"CloudSense","errorUrl":null,"homepage":"http://www.vipswapper.com/cloudsense","keyCredentials":[],"logoutUrl":null,"oauth2Permissions":[{"adminConsentDescription":"Allow the application to access CloudSense on behalf of the signed-in user.","adminConsentDisplayName":"Access CloudSense","id":"b7b7338e-683a-4796-b95e-60c10380de1c","isEnabled":true,"type":"User","userConsentDescription":"Allow the application to access CloudSense on your behalf.","userConsentDisplayName":"Access CloudSense","value":"user_impersonation"}],"passwordCredentials":[],"preferredTokenSigningKeyThumbprint":null,"publisherName":"vipswapper"quot;,"replyUrls":["http://www.vipswapper.com/cloudsense","http://www.vipswapper.com","http://vipswapper.com","http://vipswapper.azurewebsites.net","http://localhost:62080"],"samlMetadataUrl":null,"servicePrincipalNames":["http://www.vipswapper.com/cloudsense","a0448380-c346-4f9f-b897-c18733de9394"],"tags":["WindowsAzureActiveDirectoryIntegratedApp"]}]}

Ottenere l'identificatore del ruolo Controllo degli accessi in base al ruolo di AzureGet Azure RBAC role identifier

Per assegnare il ruolo Controllo degli accessi in base al ruolo appropriato all'entità servizio, è necessario determinare l'identificatore di questo ruolo di Azure.To assign the appropriate RBAC role to your service principal, you must determine the identifier of the Azure RBAC role.

Il ruolo Controllo degli accessi in base al ruolo appropriato per l'applicazione:The right RBAC role for your application:

  • Se l'applicazione monitora solo la sottoscrizione, senza apportare modifiche, richiede solo le autorizzazioni di lettura per la sottoscrizione.If your application only monitors the subscription, without making any changes, it requires only reader permissions on the subscription. Assegnare il ruolo Lettore .Assign the Reader role.
  • Se l'applicazione gestisce la sottoscrizione di Azure, creando/modificando/eliminando le entità, richiede una delle autorizzazioni di collaborazione.If your application manages Azure the subscription, creating/modifying/deleting entities, it requires one of the contributor permissions.
    • Per gestire un particolare tipo di risorsa, assegnare i ruoli di collaboratore specifici della risorsa (Collaboratore Macchina virtuale, Collaboratore Rete virtuale, Collaboratore Account di archiviazione e così via).To manage a particular type of resource, assign the resource-specific contributor roles (Virtual Machine Contributor, Virtual Network Contributor, Storage Account Contributor, etc.)
    • Per gestire un tipo di risorsa qualsiasi, assegnare il ruolo Collaboratore .To manage any resource type, assign the Contributor role.

L'assegnazione del ruolo per l'applicazione è visibile agli utenti, quindi selezionare il privilegio meno necessario.The role assignment for your application is visible to users, so select the least-required privilege.

Chiamare l' API per la definizione del ruolo di Resource Manager per elencare tutti i ruoli di Controllo degli accessi in base al ruolo di Azure e quindi scorrere il risultato per trovare la definizione di ruolo desiderata in base al nome.Call the Resource Manager role definition API to list all Azure RBAC roles and search then iterate over the result to find the desired role definition by name.

Il metodo GetRoleId dell'app di esempio ASP.NET MVC implementa questa chiamata.The GetRoleId method of the ASP.net MVC sample app implements this call.

L'esempio di richiesta seguente illustra come ottenere l'identificatore del ruolo Controllo degli accessi in base al ruolo di Azure.The following request example shows how to get Azure RBAC role identifier. 09cbd307-aa71-4aca-b346-5f253e6e3ebb è l'ID della sottoscrizione.09cbd307-aa71-4aca-b346-5f253e6e3ebb is the ID of the subscription.

GET https://management.azure.com/subscriptions/09cbd307-aa71-4aca-b346-5f253e6e3ebb/providers/Microsoft.Authorization/roleDefinitions?api-version=2015-07-01 HTTP/1.1

Authorization: Bearer eyJ0eXAiOiJKV*****fY2lGc5

La risposta è nel formato seguente:The response is in the following format:

HTTP/1.1 200 OK

{"value":[{"properties":{"roleName":"API Management Service Contributor","type":"BuiltInRole","description":"Lets you manage API Management services, but not access to them.","scope":"/","permissions":[{"actions":["Microsoft.ApiManagement/Services/*","Microsoft.Authorization/*/read","Microsoft.Resources/subscriptions/resources/read","Microsoft.Resources/subscriptions/resourceGroups/read","Microsoft.Resources/subscriptions/resourceGroups/resources/read","Microsoft.Resources/subscriptions/resourceGroups/deployments/*","Microsoft.Insights/alertRules/*","Microsoft.Support/*"],"notActions":[]}]},"id":"/subscriptions/09cbd307-aa71-4aca-b346-5f253e6e3ebb/providers/Microsoft.Authorization/roleDefinitions/312a565d-c81f-4fd8-895a-4e21e48d571c","type":"Microsoft.Authorization/roleDefinitions","name":"312a565d-c81f-4fd8-895a-4e21e48d571c"},{"properties":{"roleName":"Application Insights Component Contributor","type":"BuiltInRole","description":"Lets you manage Application Insights components, but not access to them.","scope":"/","permissions":[{"actions":["Microsoft.Insights/components/*","Microsoft.Insights/webtests/*","Microsoft.Authorization/*/read","Microsoft.Resources/subscriptions/resources/read","Microsoft.Resources/subscriptions/resourceGroups/read","Microsoft.Resources/subscriptions/resourceGroups/resources/read","Microsoft.Resources/subscriptions/resourceGroups/deployments/*","Microsoft.Insights/alertRules/*","Microsoft.Support/*"],"notActions":[]}]},"id":"/subscriptions/09cbd307-aa71-4aca-b346-5f253e6e3ebb/providers/Microsoft.Authorization/roleDefinitions/ae349356-3a1b-4a5e-921d-050484c6347e","type":"Microsoft.Authorization/roleDefinitions","name":"ae349356-3a1b-4a5e-921d-050484c6347e"}]}

Si noti che non è necessario chiamare l'API regolarmente.You do not need to call this API on an ongoing basis. Una volta determinato il GUID conosciuto della definizione del ruolo, è possibile costruire l'ID definizione del ruolo come segue:Once you've determined the well-known GUID of the role definition, you can construct the role definition ID as:

/subscriptions/{subscription_id}/providers/Microsoft.Authorization/roleDefinitions/{well-known-role-guid}

Ecco gli identificatori dei ruoli predefiniti usati comunemente:Here are the identifiers of commonly used built-in roles:

RuoloRole GUIDGUID
ReaderReader acdd72a7-3385-48ef-bd42-f606fba81ae7acdd72a7-3385-48ef-bd42-f606fba81ae7
CollaboratoreContributor b24988ac-6180-42a0-ab88-20f7382dd24cb24988ac-6180-42a0-ab88-20f7382dd24c
Collaboratore macchine virtualiVirtual Machine Contributor d73bb868-a0df-4d4d-bd69-98a00b01fccbd73bb868-a0df-4d4d-bd69-98a00b01fccb
Collaboratore reti virtualiVirtual Network Contributor b34d265f-36f7-4a0d-a4d4-e158ca92e90fb34d265f-36f7-4a0d-a4d4-e158ca92e90f
Collaboratore account di archiviazioneStorage Account Contributor 86e8f5dc-a6e9-4c67-9d15-de283e8eac2586e8f5dc-a6e9-4c67-9d15-de283e8eac25
Collaboratore siti WebWebsite Contributor de139f84-1756-47ae-9be6-808fbbe84772de139f84-1756-47ae-9be6-808fbbe84772
Collaboratore piani WebWeb Plan Contributor 2cc479cb-7b4d-49a8-b449-8c00fd0f0a4b2cc479cb-7b4d-49a8-b449-8c00fd0f0a4b
Collaboratore SQL ServerSQL Server Contributor 6d8ee4ec-f05a-4a1d-8b00-a9b17e38b4376d8ee4ec-f05a-4a1d-8b00-a9b17e38b437
Collaboratore database SQLSQL DB Contributor 9b7fa17d-e63e-47b0-bb0a-15c516ac86ec9b7fa17d-e63e-47b0-bb0a-15c516ac86ec

Assegnare il ruolo Controllo degli accessi in base al ruolo all'applicazioneAssign RBAC role to application

A questo punto è disponibile tutto quanto è necessario per assegnare il ruolo Controllo degli accessi in base al ruolo appropriato all'entità servizio usando l'API di Resource Manager per creare un'assegnazione di ruolo .You have everything you need to assign the appropriate RBAC role to your service principal by using the Resource Manager create role assignment API.

Il metodo GrantRoleToServicePrincipalOnSubscription dell'app di esempio ASP.NET MVC implementa questa chiamata.The GrantRoleToServicePrincipalOnSubscription method of the ASP.net MVC sample app implements this call.

Richiesta di esempio per assegnare il ruolo Controllo degli accessi in base al ruolo all'applicazione:An example request to assign RBAC role to application:

PUT https://management.azure.com/subscriptions/09cbd307-aa71-4aca-b346-5f253e6e3ebb/providers/microsoft.authorization/roleassignments/4f87261d-2816-465d-8311-70a27558df4c?api-version=2015-07-01 HTTP/1.1

Authorization: Bearer eyJ0eXAiOiJKV1QiL*****FlwO1mM7Cw6JWtfY2lGc5
Content-Type: application/json
Content-Length: 230

{"properties": {"roleDefinitionId":"/subscriptions/09cbd307-aa71-4aca-b346-5f253e6e3ebb/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7","principalId":"c3097b31-7309-4c59-b4e3-770f8406bad2"}}

Nella richiesta vengono usati i valori seguenti:In the request, the following values are used:

GuidGuid DescrizioneDescription
09cbd307-aa71-4aca-b346-5f253e6e3ebb09cbd307-aa71-4aca-b346-5f253e6e3ebb ID della sottoscrizionethe ID of the subscription
c3097b31-7309-4c59-b4e3-770f8406bad2c3097b31-7309-4c59-b4e3-770f8406bad2 ID oggetto dell'entità servizio dell'applicazionethe object ID of the service principal of the application
acdd72a7-3385-48ef-bd42-f606fba81ae7acdd72a7-3385-48ef-bd42-f606fba81ae7 ID del ruolo Lettorethe ID of the reader role
4f87261d-2816-465d-8311-70a27558df4c4f87261d-2816-465d-8311-70a27558df4c Nuovo GUID creato per la nuova assegnazione di ruoloa new guid created for the new role assignment

La risposta è nel formato seguente:The response is in the following format:

HTTP/1.1 201 Created

{"properties":{"roleDefinitionId":"/subscriptions/09cbd307-aa71-4aca-b346-5f253e6e3ebb/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7","principalId":"c3097b31-7309-4c59-b4e3-770f8406bad2","scope":"/subscriptions/09cbd307-aa71-4aca-b346-5f253e6e3ebb"},"id":"/subscriptions/09cbd307-aa71-4aca-b346-5f253e6e3ebb/providers/Microsoft.Authorization/roleAssignments/4f87261d-2816-465d-8311-70a27558df4c","type":"Microsoft.Authorization/roleAssignments","name":"4f87261d-2816-465d-8311-70a27558df4c"}

Ottenere il token di accesso solo app per Azure Resource ManagerGet app-only access token for Azure Resource Manager

Per verificare che l'app abbia l'accesso desiderato alla sottoscrizione, eseguire un'attività di test nella sottoscrizione usando un token solo app.To validate that app has the desired access on the subscription, perform a test task on the subscription using an app-only token.

Per ottenere un token di accesso solo app, seguire le istruzioni nella sezione Ottenere il token di accesso solo app per l'API Graph di Azure ADcon un valore diverso per il parametro della risorsa:To get an app-only access token, follow instructions from section Get app-only access token for Azure AD Graph API, with a different value for the resource parameter:

https://management.core.windows.net/

Il metodo ServicePrincipalHasReadAccessToSubscription dell'applicazione di esempio ASP.NET MVC ottiene un token di accesso solo app per Azure Resource Manager usando Active Directory Authentication Library per .NET.The ServicePrincipalHasReadAccessToSubscription method of the ASP.NET MVC sample application gets an app-only access token for Azure Resource Manager using the Active Directory Authentication Library for .net.

Ottenere le autorizzazioni dell'applicazione per la sottoscrizioneGet Application's Permissions on Subscription

Per verificare che l'applicazione abbia l'accesso desiderato in una sottoscrizione di Azure, è anche possibile chiamare l'API di Resource Manager per elencare le autorizzazioni .To check that your application has the desired access on an Azure subscription, you may also call the Resource Manager Permissions API. Questo approccio è simile a quello usato per determinare se all'utente sono concessi i diritti di gestione degli accessi per la sottoscrizione.This approach is similar to how you determined whether the user has Access Management rights for the subscription. Questa volta occorre però chiamare l'API per le autorizzazioni con il token di accesso solo app ottenuto nel passaggio precedente.However, this time, call the permissions API with the app-only access token that you received in the previous step.

Il metodo ServicePrincipalHasReadAccessToSubscription dell'app di esempio ASP.NET MVC implementa questa chiamata.The ServicePrincipalHasReadAccessToSubscription method of the ASP.NET MVC sample app implements this call.

Gestire le sottoscrizioni connesseManage connected subscriptions

Quando il ruolo Controllo degli accessi in base al ruolo appropriato viene assegnato all'entità servizio dell'applicazione nella sottoscrizione, l'applicazione può continuare a monitorarla/gestirla usando i token di accesso solo app per Azure Resource Manager.When the appropriate RBAC role is assigned to your application's service principal on the subscription, your application can keep monitoring/managing it using app-only access tokens for Azure Resource Manager.

Se il proprietario di una sottoscrizione rimuove l'assegnazione del ruolo dell'applicazione usando il portale o gli strumenti da riga di comando, l'applicazione non potrà più accedere a tale sottoscrizione.If a subscription owner removes your application's role assignment using the portal or command-line tools, your application is no longer able to access that subscription. In tal caso, è consigliabile informare l'utente che la connessione con la sottoscrizione è stata interrotta dall'esterno dell'applicazione e offrirgli la possibilità di "ripristinare" la connessione.In that case, you should notify the user that the connection with the subscription was severed from outside the application and give them an option to "repair" the connection. Il "ripristino" creerà di nuovo l'assegnazione del ruolo eliminata offline."Repair" would re-create the role assignment that was deleted offline.

Come si è consentito all'utente di connettere le sottoscrizioni all'applicazione, è necessario consentirgli anche di disconnetterle.Just as you enabled the user to connect subscriptions to your application, you must allow the user to disconnect subscriptions too. Dal punto di vista della gestione degli accessi, disconnettere significa rimuovere l'assegnazione del ruolo che l'entità servizio dell'applicazione ha nella sottoscrizione.From an access management point of view, disconnect means removing the role assignment that the application's service principal has on the subscription. Facoltativamente, è possibile rimuovere anche qualsiasi stato dell'applicazione per la sottoscrizione.Optionally, any state in the application for the subscription might be removed too. Solo gli utenti con l'autorizzazione per la gestione degli accessi possono disconnettere la sottoscrizione.Only users with access management permission on the subscription are able to disconnect the subscription.

Il metodo RevokeRoleFromServicePrincipalOnSubscription dell'app di esempio ASP.NET MVC implementa questa chiamata.The RevokeRoleFromServicePrincipalOnSubscription method of the ASP.net MVC sample app implements this call.

Gli utenti ora possono connettere e gestire facilmente le sottoscrizioni di Azure con l'applicazione.That's it - users can now easily connect and manage their Azure subscriptions with your application.