Os aplicativos Daemon usam permissões de aplicativo em vez de permissões delegadas. Portanto, o tipo de conta suportada não pode ser uma conta em nenhum diretório organizacional ou qualquer conta pessoal da Microsoft (por exemplo, Skype, Xbox, Outlook.com). Não há nenhum administrador de locatário para conceder consentimento a um aplicativo daemon para uma conta pessoal da Microsoft. Você precisa escolher contas na minha organização ou contas em qualquer organização.
A autoridade especificada na configuração do aplicativo deve ser locatária (especificando um ID de locatário ou um nome de domínio associado à sua organização).
Mesmo se você quiser fornecer uma ferramenta multilocatário, você deve usar um ID de locatário ou nome de domínio, e nãocommon ou organizations com esse fluxo, porque o serviço não pode inferir de forma confiável qual locatário deve ser usado.
Configurar e instanciar o aplicativo
Nas bibliotecas MSAL, as credenciais do cliente (segredo ou certificado) são passadas como um parâmetro da construção confidencial do aplicativo cliente.
Importante
Mesmo que seu aplicativo seja um aplicativo de console executado como um serviço, se for um aplicativo daemon, ele precisará ser um aplicativo cliente confidencial.
Arquivo de configuração
O arquivo de configuração define:
A instância de nuvem e o ID do locatário, que juntos compõem a autoridade.
A ID do cliente que você obteve do registro do aplicativo.
Aqui está um exemplo de definição da configuração em um arquivo appsettings.json. Este exemplo é retirado do exemplo de código de daemon do console .NET no 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]"
}
]
}
}
Você fornece um certificado em vez do segredo do cliente ou credenciais de federação de identidade de carga de trabalho.
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");
Os parâmetros de configuração para o exemplo de daemon Node.js estão localizados em um arquivo .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"
}
Aqui está um exemplo de definição da configuração em um arquivo appsettings.json. Este exemplo é retirado do exemplo de código de daemon do console .NET no 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]"
}
Você fornece um ClientSecret ou um CertificateNamearquivo . Essas configurações são exclusivas.
Instanciar o aplicativo MSAL
Para instanciar o aplicativo MSAL, adicione, faça referência ou importe o pacote MSAL (dependendo do idioma).
A construção é diferente, dependendo se você está usando segredos de cliente ou certificados (ou, como um cenário avançado, asserções assinadas).
Referenciar o pacote
Faça referência ao pacote MSAL no código do aplicativo.
Adicione o pacote NuGet Microsoft.Identity.Web.TokenAcquisition ao seu aplicativo.
Como alternativa, se você quiser chamar o Microsoft Graph, adicione o pacote Microsoft.Identity.Web.GraphServiceClient .
O seu projeto pode ser o seguinte. O arquivo appsettings.json precisa ser copiado para o diretório de saída.
Instale os pacotes executando npm install na pasta onde package.json o arquivo reside. Em seguida, importe o msal-node pacote:
const msal = require('@azure/msal-node');
import msal
import json
import sys
import logging
Adicione o pacote NuGet Microsoft.Identity.Client ao seu aplicativo e, em seguida, adicione uma using diretiva em seu código para fazer referência a ele.
Em MSAL.NET, o aplicativo cliente confidencial é representado pela IConfidentialClientApplication interface.
using Microsoft.Identity.Client;
IConfidentialClientApplication app;
Instanciar o aplicativo cliente confidencial com um segredo do cliente
Aqui está o código para instanciar o aplicativo cliente confidencial com um segredo do cliente:
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();
// ...
}
}
A configuração é lida a partir do 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
)
O Authority é uma concatenação da instância de nuvem e do ID do locatário, por exemplo https://login.microsoftonline.com/contoso.onmicrosoft.com ou https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee. No arquivo appsettings.json mostrado na seção Arquivo de configuração, a instância e o Instance locatário são representados pelos valores e Tenant , respectivamente.
No exemplo de código, o trecho anterior foi retirado, Authority é uma propriedade na classe AuthenticationConfig e é definido como tal:
/// <summary>
/// URL of the authority
/// </summary>
public string Authority
{
get
{
return String.Format(CultureInfo.InvariantCulture, Instance, Tenant);
}
}
Instanciar o aplicativo cliente confidencial com um certificado de cliente
Aqui está o código para criar um aplicativo com um certificado:
O código em si é exatamente o mesmo. O certificado é descrito na configuração.
Há muitas maneiras de obter o certificado. Para mais pormenores, ver https://aka.ms/ms-id-web-certificates.
Veja como você faria para obter seu certificado do KeyVault. A identidade da Microsoft delega à DefaultAzureCredential da Identidade do Azure e usa a identidade gerenciada quando disponível para acessar o certificado do KeyVault. Você pode depurar seu aplicativo localmente, pois ele usa suas credenciais de desenvolvedor.
# 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
)
Além de usar um segredo ou certificado de cliente, os aplicativos cliente confidenciais também podem provar sua identidade usando asserções de cliente. Consulte CredentialDescription para obter detalhes.
Para obter detalhes, consulte Inicializar o objeto ConfidentialClientApplication.
No MSAL Python, você pode fornecer declarações de cliente usando as declarações que serão assinadas pela chave privada desta ConfidentialClientApplicationchave.
# 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
)
Quando você usa WithClientClaimso , MSAL.NET produz uma asserção assinada que contém as declarações esperadas pela ID do Microsoft Entra, além de declarações de cliente adicionais que você deseja enviar.
Este código mostra como fazer isso: