Daemonanwendungen verwenden Anwendungsberechtigungen anstelle von delegierten Berechtigungen. Daher kann ihr unterstützter Kontotyp kein Konto in einem Organisationsverzeichnis und kein persönliches Microsoft-Konto (z. B. Skype, Xbox, Outlook.com) sein. Es gibt keinen Mandantenadministrator, der der Daemonanwendung für persönliche Microsoft-Konten Einwilligung erteilen könnte. Sie müssen accounts in my organization (Konten in meiner Organisation) oder accounts in any organization (Konten in allen Organisationen) auswählen.
Die in der Anwendungskonfiguration angegebene Autorität sollte über einen Mandanten verfügen (eine Mandanten-ID oder ein Domänennamen, die zu Ihrer Organisation gehören).
Auch wenn Sie ein mehrinstanzenfähiges Tool bereitstellen möchten, sollten Sie bei diesem Flow eine Mandanten-ID oder einen Domänennamen verwenden und nichtcommon oder organizations, da der Dienst nicht zuverlässig ableiten kann, welcher Mandant verwendet werden soll.
Konfigurieren und Instanziieren der Anwendung
Die Clientanmeldeinformationen in MSAL-Bibliotheken (Geheimnis oder Zertifikat) werden als Parameter der vertraulichen Clientanwendungskonstruktion übergeben.
Wichtig
Auch wenn Ihre Anwendung eine Konsolenanwendung ist, die als Dienst ausgeführt wird, muss sie eine vertrauliche Clientanwendung sein, wenn sie eine Daemonanwendung ist.
Konfigurationsdatei
Die Konfigurationsdatei definiert Folgendes:
Die Cloudinstanz und die Mandanten-ID, die zusammen die Autorität bilden.
Die Client-ID, die Sie bei der Anwendungsregistrierung erhalten haben
Hier finden Sie ein Beispiel für die Definition der Konfiguration in der Datei appsettings.json. Dieses Beispiel stammt aus dem Codebeispiel .NET-Konsolen-Daemon auf 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]"
}
]
}
}
Sie stellen ein Zertifikat anstelle des geheimen Clientschlüssels oder der Anmeldeinformationen des Workloadidentitätsverbunds bereit.
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");
# 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/
Beim Erstellen eines vertraulichen Clients mit geheimen Clientschlüsseln sieht die Konfigurationsdatei parameters.json im Beispiel für den Python-Daemon wie folgt aus:
{
"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"
}
Beim Erstellen eines vertraulichen Clients mit Zertifikaten sieht die Konfigurationsdatei parameters.json im Beispiel für den Python-Daemon wie folgt aus:
{
"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"
}
Hier finden Sie ein Beispiel für die Definition der Konfiguration in der Datei appsettings.json. Dieses Beispiel stammt aus dem Codebeispiel .NET-Konsolen-Daemon auf 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]"
}
Sie stellen entweder ein ClientSecret oder einen CertificateName bereit. Diese Einstellungen sind exklusiv.
Instanziierung der MSAL-Anwendung
Sie müssen zum Instanziieren der MSAL-Anwendung das MSAL-Paket hinzufügen, darauf verweisen oder es importieren (abhängig von der Sprache).
Die Konstruktion unterscheidet sich je nach Verwendung von geheimen Clientschlüsseln oder Zertifikaten (oder als erweitertes Szenario mit signierten Assertionen).
Verweisen auf das Paket
Verweisen Sie im Anwendungscode auf das MSAL-Paket.
Fügen Sie Ihrer Anwendung das NuGet-Paket Microsoft.Identity.Web.TokenAcquisition hinzu.
Wenn Sie Microsoft Graph aufrufen möchten, fügen Sie alternativ das Paket Microsoft.Identity.Web.GraphServiceClient hinzu.
Ihr Projekt könnte wie folgt aussehen. Die Datei appsettings.json muss in das Ausgabeverzeichnis kopiert werden.
Installieren Sie die Pakete durch Ausführen von npm install in dem Ordner, in dem sich die Datei package.json befindet. Importieren Sie dann das Paket msal-node:
const msal = require('@azure/msal-node');
import msal
import json
import sys
import logging
Fügen Sie Ihrer Anwendung das NuGet-Paket Microsoft.Identity.Client hinzu, und fügen Sie dann im Code eine using-Direktive hinzu, um darauf zu verweisen.
In MSAL.NET wird die vertrauliche Clientanwendung durch die IConfidentialClientApplication-Schnittstelle dargestellt.
using Microsoft.Identity.Client;
IConfidentialClientApplication app;
Instanziieren der vertraulichen Clientanwendung mit einem geheimen Clientschlüssel
Im Folgenden finden Sie den Code zum Instanziieren der vertraulichen Clientanwendung mit einem geheimen Clientschlüssel:
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();
// ...
}
}
Die Konfiguration wird aus appsettings.json gelesen:
# 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
)
Die Authority ist eine Verkettung der Cloudinstanz und der Mandanten-ID, z. B. https://login.microsoftonline.com/contoso.onmicrosoft.com oder https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee. In der im Abschnitt Konfigurationsdatei abgebildeten Datei appsettings.json werden die Instanz und der Mandant durch die Werte Instance und Tenant dargestellt.
In dem Codebeispiel, aus dem der vorherige Ausschnitt stammt, ist Authority eine Eigenschaft für die AuthenticationConfig-Klasse und als solche definiert:
/// <summary>
/// URL of the authority
/// </summary>
public string Authority
{
get
{
return String.Format(CultureInfo.InvariantCulture, Instance, Tenant);
}
}
Instanziieren der vertraulichen Clientanwendung mit einem Clientzertifikat
Im Folgenden finden Sie den Code zum Erstellen einer Anwendung mit einem Zertifikat:
Der Code selbst ist identisch. Das Zertifikat wird in der Konfiguration beschrieben.
Es gibt viele Möglichkeiten, das Zertifikat abzurufen. Einzelheiten hierzu finden Sie unter https://aka.ms/ms-id-web-certificates.
Hier erfahren Sie, wie Sie Ihr Zertifikat aus KeyVault abrufen. Die Microsoft-Identität delegiert an „DefaultAzureCredential“ der Azure-Identität und verwendet eine verwaltete Identität, sofern verfügbar, um über KeyVault auf das Zertifikat zuzugreifen. Sie können Ihre Anwendung lokal debuggen, da sie dann Ihre Entwickleranmeldeinformationen verwendet.
# 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
)
Zusätzlich zur Verwendung eines geheimen Clientschlüssels oder Zertifikats können vertrauliche Clientanwendungen ihre Identität auch mithilfe von Client-Assertionen nachweisen. Ausführliche Informationen finden Sie unter CredentialDescription.
In MSAL Python können Sie Clientansprüche mithilfe der Ansprüche bereitstellen, die mit dem privaten Schlüssel von ConfidentialClientApplication signiert werden.
# 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
)
Die vertrauliche Clientanwendung kann ihre Identität statt mit einem geheimen Clientschlüssel oder einem Zertifikat auch mithilfe von Clientassertionen nachweisen.
MSAL.NET verfügt über zwei Methoden, um für die vertrauliche Client-App signierte Assertionen bereitzustellen:
.WithClientAssertion()
.WithClientClaims()
Stellen Sie ein JSON Web Token bereit, wenn Sie WithClientAssertion verwenden. Dieses erweiterte Szenario wird unter Clientassertionen ausführlich erläutert.
Bei Verwendung von WithClientClaims erstellt MSAL.NET eine signierte Assertion, die die von Microsoft Entra ID erwarteten Ansprüche sowie zusätzliche Clientansprüche enthält, die Sie senden möchten.
Dies wird im folgenden Code veranschaulicht: