Daemon-toepassingen gebruiken toepassingsmachtigingen in plaats van gedelegeerde machtigingen. Het ondersteunde accounttype kan dus geen account zijn in een organisatiedirectory of een persoonlijk Microsoft-account (bijvoorbeeld Skype, Xbox, Outlook.com). Er is geen tenantbeheerder om toestemming te verlenen aan een daemontoepassing voor een persoonlijk Microsoft-account. U moet accounts kiezen in mijn organisatie of accounts in elke organisatie.
De instantie die is opgegeven in de toepassingsconfiguratie moet een tenant zijn (waarbij een tenant-id of een domeinnaam wordt opgegeven die is gekoppeld aan uw organisatie).
Zelfs als u een hulpprogramma voor meerdere tenants wilt opgeven, moet u een tenant-id of domeinnaam gebruiken en nietcommon of organizations met deze stroom, omdat de service niet betrouwbaar kan afleiden welke tenant moet worden gebruikt.
De toepassing configureren en starten
In MSAL-bibliotheken worden de clientreferenties (geheim of certificaat) doorgegeven als een parameter van de bouw van vertrouwelijke clienttoepassingen.
Belangrijk
Zelfs als uw toepassing een consoletoepassing is die als een service wordt uitgevoerd of een daemontoepassing is, moet het een vertrouwelijke clienttoepassing zijn.
Configuratiebestand
Het configuratiebestand definieert:
Het cloudexemplaar en de tenant-id, die samen de instantie vormen.
De client-id die u hebt verkregen uit de registratie van de toepassing.
Hier volgt een voorbeeld van het definiëren van de configuratie in een appsettings.json-bestand. Dit voorbeeld is afkomstig uit het codevoorbeeld van de .NET-console-daemon op 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]"
}
]
}
}
U geeft een certificaat op in plaats van het clientgeheim of de federatiereferenties van de workloadidentiteit.
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/
{
"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"
}
Hier volgt een voorbeeld van het definiëren van de configuratie in een appsettings.json-bestand. Dit voorbeeld is afkomstig uit het codevoorbeeld van de .NET-console-daemon op 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]"
}
U geeft een ClientSecret of een CertificateName op. Deze instellingen zijn exclusief.
De MSAL-toepassing starten
Als u de MSAL-toepassing wilt starten, voegt u het MSAL-pakket toe, verwijst u ernaar of importeert u het (afhankelijk van de taal).
De constructie is verschillend, afhankelijk van of u clientgeheimen of certificaten gebruikt (of, als een geavanceerd scenario, ondertekende asserties).
Naar het pakket verwijzen
Verwijs naar het MSAL-pakket in uw toepassingscode.
Installeer de pakketten door uit te voeren npm install in de map waarin package.json het bestand zich bevindt. Importeer vervolgens het msal-node pakket:
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();
// ...
}
}
De configuratie wordt gelezen uit de 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 is een samenvoeging van het cloudexemplaar en de tenant-id, bijvoorbeeld https://login.microsoftonline.com/contoso.onmicrosoft.com of https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee. In het appsettings.json bestand dat wordt weergegeven in de sectie Configuratiebestand , worden exemplaar en tenant vertegenwoordigd door respectievelijk de Instance en Tenant waarden.
In het codevoorbeeld waaruit het vorige codefragment is genomen, is Authority een eigenschap voor de klasse AuthenticationConfig en wordt als volgt gedefinieerd:
/// <summary>
/// URL of the authority
/// </summary>
public string Authority
{
get
{
return String.Format(CultureInfo.InvariantCulture, Instance, Tenant);
}
}
De vertrouwelijke clienttoepassing starten met een clientcertificaat
Dit is de code voor het bouwen van een toepassing met een certificaat:
De code zelf is precies hetzelfde. Het certificaat wordt beschreven in de configuratie.
Er zijn veel manieren om het certificaat op te halen. Zie voor meer informatie https://aka.ms/ms-id-web-certificates.
U kunt als volgt uw certificaat ophalen uit KeyVault. Microsoft-identiteit delegeert naar de DefaultAzureCredential van Azure Identity en gebruikte beheerde identiteit wanneer deze beschikbaar is voor toegang tot het certificaat vanuit KeyVault. U kunt lokaal fouten in uw toepassing opsporen, omdat deze vervolgens gebruikmaakt van uw referenties voor ontwikkelaars.
# 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
)
Naast het gebruik van een clientgeheim of certificaat kunnen vertrouwelijke clienttoepassingen ook hun identiteit bewijzen met behulp van clientverklaringen. Zie CredentialDescription voor meer informatie.
In MSAL Python kunt u clientclaims opgeven met behulp van de claims die worden ondertekend door de persoonlijke sleutel van deze ConfidentialClientApplication.
# 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
)
Wanneer u gebruikt WithClientClaims, produceert MSAL.NET een ondertekende assertie die de claims bevat die worden verwacht door Microsoft Entra ID, plus aanvullende clientclaims die u wilt verzenden.
Deze code laat zien hoe u dit doet: