Aplikacje demona używają uprawnień aplikacji, a nie uprawnień delegowanych. Dlatego ich obsługiwany typ konta nie może być kontem w żadnym katalogu organizacyjnym ani żadnym osobistym kontem Microsoft (na przykład Skype, Xbox, Outlook.com). Nie ma administratora dzierżawy, aby udzielić zgody na aplikację demona dla konta osobistego Microsoft. Musisz wybrać konta w mojej organizacji lub kontach w dowolnej organizacji.
Urząd określony w konfiguracji aplikacji powinien być dzierżawiony (określanie identyfikatora dzierżawy lub nazwy domeny skojarzonej z organizacją).
Nawet jeśli chcesz podać wielodostępne narzędzie, należy użyć identyfikatora dzierżawy lub nazwy domeny, a niecommon tego organizations przepływu, ponieważ usługa nie może niezawodnie wnioskować, której dzierżawy należy użyć.
Konfigurowanie i tworzenie wystąpienia aplikacji
W bibliotekach MSAL poświadczenia klienta (klucz tajny lub certyfikat) są przekazywane jako parametr poufnej konstrukcji aplikacji klienckiej.
Ważne
Nawet jeśli aplikacja jest aplikacją konsolową, która działa jako usługa, jeśli jest to aplikacja demona, musi być poufnej aplikacji klienckiej.
Plik konfiguracji
Plik konfiguracji definiuje:
Wystąpienie chmury i identyfikator dzierżawy, które razem tworzą urząd.
Identyfikator klienta uzyskany z rejestracji aplikacji.
Oto przykład definiowania konfiguracji w pliku appsettings.json. Ten przykład jest pobierany z przykładu kodu demona konsoli platformy .NET w witrynie 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]"
}
]
}
}
Należy podać certyfikat zamiast klucza tajnego klienta lub poświadczenia federacji tożsamości obciążenia.
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");
Parametry konfiguracji przykładu demona Node.js znajdują się w pliku 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"
}
Oto przykład definiowania konfiguracji w pliku appsettings.json. Ten przykład jest pobierany z przykładu kodu demona konsoli platformy .NET w witrynie 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]"
}
Należy podać wartość ClientSecret lub .CertificateName Te ustawienia są wyłączne.
Tworzenie wystąpienia aplikacji MSAL
Aby utworzyć wystąpienie aplikacji MSAL, dodaj, odwołaj się lub zaimportuj pakiet MSAL (w zależności od języka).
Konstrukcja różni się w zależności od tego, czy używasz wpisów tajnych klienta, czy certyfikatów (lub, jako zaawansowanego scenariusza, podpisanych asercji).
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();
// ...
}
}
# 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
)
Jest Authority to łączenie wystąpienia chmury i identyfikatora dzierżawy, na przykład https://login.microsoftonline.com/contoso.onmicrosoft.com lub https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee. W pliku appsettings.json pokazanym w sekcji Plik konfiguracji wystąpienie i dzierżawa są reprezentowane odpowiednio przez Instance wartości i Tenant .
W przykładzie kodu pobrano poprzedni fragment kodu, Authority jest właściwością klasy AuthenticationConfig i jest zdefiniowana jako następująca:
/// <summary>
/// URL of the authority
/// </summary>
public string Authority
{
get
{
return String.Format(CultureInfo.InvariantCulture, Instance, Tenant);
}
}
Tworzenie wystąpienia poufnej aplikacji klienckiej przy użyciu certyfikatu klienta
Oto kod umożliwiający skompilowanie aplikacji przy użyciu certyfikatu:
Sam kod jest dokładnie taki sam. Certyfikat jest opisany w konfiguracji.
Istnieje wiele sposobów uzyskania certyfikatu. Aby uzyskać szczegółowe informacje, zobacz https://aka.ms/ms-id-web-certificates.
Poniżej przedstawiono sposób uzyskiwania certyfikatu z usługi KeyVault. Delegowanie tożsamości firmy Microsoft do domyślnej usługi Azure IdentityAzureCredential i używanej tożsamości zarządzanej, gdy jest dostępna do uzyskania dostępu do certyfikatu z usługi KeyVault. Możesz debugować aplikację lokalnie, ponieważ następnie używa poświadczeń dewelopera.
# 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
)
Oprócz używania klucza tajnego klienta lub certyfikatu poufne aplikacje klienckie mogą również udowodnić swoją tożsamość przy użyciu asercji klientów. Aby uzyskać szczegółowe informacje, zobacz CredentialDescription (Opis poświadczeń ).
Aby uzyskać szczegółowe informacje, zobacz Inicjowanie obiektu ConfidentialClientApplication.
W języku MSAL Python można podać oświadczenia klienta przy użyciu oświadczeń, które zostaną podpisane przez ten ConfidentialClientApplicationklucz prywatny.
# 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
)
Zamiast klucza tajnego klienta lub certyfikatu, poufne aplikacje klienckie mogą również udowodnić swoją tożsamość przy użyciu asercji klienta.
MSAL.NET ma dwie metody dostarczania podpisanych asercji do poufnej aplikacji klienckiej:
.WithClientAssertion()
.WithClientClaims()
W przypadku korzystania z elementu WithClientAssertionpodaj podpisany zestaw JWT. Ten zaawansowany scenariusz został szczegółowo opisany w artykule Asercji klientów.
W przypadku korzystania z usługi WithClientClaimsMSAL.NET tworzy podpisane potwierdzenie zawierające oświadczenia oczekiwane przez identyfikator Entra firmy Microsoft oraz dodatkowe oświadczenia klienta, które chcesz wysłać.
Ten kod pokazuje, jak to zrobić: