Le applicazioni daemon usano autorizzazioni dell'applicazione anziché autorizzazioni delegate. Quindi il tipo di account supportato non può essere un account in alcuna directory organizzativa o in qualsiasi account Microsoft personale (ad esempio, Skype, Xbox, Outlook.com). Non esiste alcun amministratore tenant per concedere il consenso a un'applicazione daemon per un account personale Microsoft. È necessario scegliere gli account nell'organizzazione o negli account in qualsiasi organizzazione.
L'autorità specificata nella configurazione dell'applicazione deve essere in tenant (specificando un ID tenant o un nome di dominio associato all'organizzazione).
Anche se si vuole fornire uno strumento multi-tenant, è consigliabile usare un ID tenant o un nome di dominio e noncommon o organizations con questo flusso, perché il servizio non può dedurre in modo affidabile quale tenant deve essere usato.
Configurare e creare un'istanza dell'applicazione
Nelle librerie MSAL le credenziali client (segreto o certificato) vengono passate come parametro della costruzione di applicazioni client riservate.
Importante
Anche se l'applicazione è un'applicazione console che viene eseguita come servizio, se si tratta di un'applicazione daemon, deve essere un'applicazione client riservata.
File di configurazione
Il file di configurazione definisce:
L'istanza cloud e l'ID tenant, che insieme costituiscono l'autorità.
ID client ottenuto dalla registrazione dell'applicazione.
Ecco un esempio di definizione della configurazione in un file appsettings.json. Questo esempio è tratto dall'esempio di codice del daemon della console .NET in GitHub.
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "[Enter here the tenantID or domain name for your Azure AD tenant]",
"ClientId": "[Enter here the ClientId for your application]",
"ClientCredentials": [
{
"SourceType": "ClientSecret",
"ClientSecret": "[Enter here a client secret for your application]"
}
]
}
}
Specificare un certificato anziché il segreto client o le credenziali di federazione dell'identità del carico di lavoro.
private final static String CLIENT_ID = "";
private final static String AUTHORITY = "https://login.microsoftonline.com/<tenant>/";
private final static String CLIENT_SECRET = "";
private final static Set<String> SCOPE = Collections.singleton("https://graph.microsoft.com/.default");
I parametri di configurazione per l'esempio di daemon Node.js si trovano in un file con estensione env:
# Credentials
TENANT_ID=Enter_the_Tenant_Info_Here
CLIENT_ID=Enter_the_Application_Id_Here
// You provide either a ClientSecret or a CertificateConfiguration, or a ClientAssertion. These settings are exclusive
CLIENT_SECRET=Enter_the_Client_Secret_Here
CERTIFICATE_THUMBPRINT=Enter_the_certificate_thumbprint_Here
CERTIFICATE_PRIVATE_KEY=Enter_the_certificate_private_key_Here
CLIENT_ASSERTION=Enter_the_Assertion_String_Here
# Endpoints
// the Azure AD endpoint is the authority endpoint for token issuance
AAD_ENDPOINT=Enter_the_Cloud_Instance_Id_Here // https://login.microsoftonline.com/
// the graph endpoint is the application ID URI of Microsoft Graph
GRAPH_ENDPOINT=Enter_the_Graph_Endpoint_Here // https://graph.microsoft.com/
{
"authority": "https://login.microsoftonline.com/<your_tenant_id>",
"client_id": "your_client_id",
"scope": [ "https://graph.microsoft.com/.default" ],
"secret": "The secret generated by Azure AD during your confidential app registration",
"endpoint": "https://graph.microsoft.com/v1.0/users"
}
{
"authority": "https://login.microsoftonline.com/<your_tenant_id>",
"client_id": "your_client_id",
"scope": [ "https://graph.microsoft.com/.default" ],
"thumbprint": "790E... The thumbprint generated by Azure AD when you upload your public cert",
"private_key_file": "server.pem",
"endpoint": "https://graph.microsoft.com/v1.0/users"
}
Ecco un esempio di definizione della configurazione in un file appsettings.json. Questo esempio è tratto dall'esempio di codice del daemon della console .NET in GitHub.
{
"Instance": "https://login.microsoftonline.com/{0}",
"Tenant": "[Enter here the tenantID or domain name for your Azure AD tenant]",
"ClientId": "[Enter here the ClientId for your application]",
"ClientSecret": "[Enter here a client secret for your application]",
"CertificateName": "[Or instead of client secret: Enter here the name of a certificate (from the user cert store) as registered with your application]"
}
Specificare un oggetto ClientSecret o un oggetto CertificateName. Queste impostazioni sono esclusive.
Creare un'istanza dell'applicazione MSAL
Per creare un'istanza dell'applicazione MSAL, aggiungere, fare riferimento o importare il pacchetto MSAL (a seconda della lingua).
La costruzione è diversa, a seconda che si usino segreti client o certificati (o, come scenario avanzato, asserzioni firmate).
Fare riferimento al pacchetto
Fare riferimento al pacchetto MSAL nel codice dell'applicazione.
class Program
{
static async Task Main(string[] _)
{
// Get the Token acquirer factory instance. By default it reads an appsettings.json
// file if it exists in the same folder as the app (make sure that the
// "Copy to Output Directory" property of the appsettings.json file is "Copy if newer").
TokenAcquirerFactory tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
// Configure the application options to be read from the configuration
// and add the services you need (Graph, token cache)
IServiceCollection services = tokenAcquirerFactory.Services;
services.AddMicrosoftGraph();
// By default, you get an in-memory token cache.
// For more token cache serialization options, see https://aka.ms/msal-net-token-cache-serialization
// Resolve the dependency injection.
var serviceProvider = tokenAcquirerFactory.Build();
// ...
}
}
La configurazione viene letta dal appsettings.json:
# Pass the parameters.json file as an argument to this Python script. E.g.: python your_py_file.py parameters.json
config = json.load(open(sys.argv[1]))
# Create a preferably long-lived app instance that maintains a token cache.
app = msal.ConfidentialClientApplication(
config["client_id"], authority=config["authority"],
client_credential=config["secret"],
# token_cache=... # Default cache is in memory only.
# You can learn how to use SerializableTokenCache from
# https://msal-python.rtfd.io/en/latest/#msal.SerializableTokenCache
)
Authority è una concatenazione dell'istanza cloud e dell'ID tenant, ad esempio https://login.microsoftonline.com/contoso.onmicrosoft.com o https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee. Nel file appsettings.json illustrato nella sezione File di configurazione, l'istanza e il Instance tenant sono rappresentati rispettivamente dai valori e Tenant .
Nell'esempio di codice da cui è stato tratto Authority il frammento precedente è una proprietà della classe AuthenticationConfig ed è definita come tale:
/// <summary>
/// URL of the authority
/// </summary>
public string Authority
{
get
{
return String.Format(CultureInfo.InvariantCulture, Instance, Tenant);
}
}
Creare un'istanza dell'applicazione client riservata con un certificato client
Ecco il codice per compilare un'applicazione con un certificato:
Il codice stesso è esattamente lo stesso. Il certificato è descritto nella configurazione.
Esistono molti modi per ottenere il certificato. Per informazioni dettagliate, vedere https://aka.ms/ms-id-web-certificates.
Ecco come ottenere il certificato da KeyVault. Le identità Microsoft delegano l'identità predefinita di AzureAzureCredential e usano l'identità gestita quando disponibili per accedere al certificato da KeyVault. È possibile eseguire il debug dell'applicazione in locale, perché usa le credenziali per sviluppatore.
# Pass the parameters.json file as an argument to this Python script. E.g.: python your_py_file.py parameters.json
config = json.load(open(sys.argv[1]))
# Create a preferably long-lived app instance that maintains a token cache.
app = msal.ConfidentialClientApplication(
config["client_id"], authority=config["authority"],
client_credential={"thumbprint": config["thumbprint"], "private_key": open(config['private_key_file']).read()},
# token_cache=... # Default cache is in memory only.
# You can learn how to use SerializableTokenCache from
# https://msal-python.rtfd.io/en/latest/#msal.SerializableTokenCache
)
Oltre a usare un segreto client o un certificato, le applicazioni client riservate possono dimostrare la propria identità anche usando asserzioni client. Per informazioni dettagliate, vedere CredentialDescription .
In MSAL Python è possibile fornire attestazioni client usando le attestazioni che verranno firmate da questa ConfidentialClientApplicationchiave privata.
# Pass the parameters.json file as an argument to this Python script. E.g.: python your_py_file.py parameters.json
config = json.load(open(sys.argv[1]))
# Create a preferably long-lived app instance that maintains a token cache.
app = msal.ConfidentialClientApplication(
config["client_id"], authority=config["authority"],
client_credential={"thumbprint": config["thumbprint"], "private_key": open(config['private_key_file']).read()},
client_claims = {"client_ip": "x.x.x.x"}
# token_cache=... # Default cache is in memory only.
# You can learn how to use SerializableTokenCache from
# https://msal-python.rtfd.io/en/latest/#msal.SerializableTokenCache
)
Per informazioni dettagliate, vedere la documentazione di riferimento di MSAL Python per ConfidentialClientApplication.
Anziché un segreto client o un certificato, l'applicazione client riservata può anche dimostrare la propria identità usando asserzioni client.
MSAL.NET include due metodi per fornire asserzioni firmate all'app client riservata:
.WithClientAssertion()
.WithClientClaims()
Quando si usa WithClientAssertion, specificare un token JWT firmato. Questo scenario avanzato è dettagliato in Asserzioni client.
Quando si usa WithClientClaims, MSAL.NET produce un'asserzione firmata che contiene le attestazioni previste dall'ID Microsoft Entra, oltre a attestazioni client aggiuntive da inviare.
Questo codice illustra come eseguire questa operazione: