Aplica-se a:
Locatários da força de trabalho (saiba mais)
Saiba como configurar o código do seu aplicativo daemon que chama APIs da Web.
Bibliotecas da Microsoft com suporte para aplicativos daemon
As seguintes bibliotecas da Microsoft dão suporte aos aplicativos daemon:
1Os Termos de Licença Universal para Serviços Online se aplicam a bibliotecas em Visualização Pública.
Os aplicativos daemon usam permissões de aplicativo em vez de permissões delegadas. Portanto, o tipo de conta com suporte não pode ser uma conta de nenhum diretório organizacional ou qualquer conta Microsoft pessoal (por exemplo: Skype, Xbox, Outlook.com). Não há nenhum administrador locatário para conceder a concessão a um aplicativo daemon para uma conta pessoal da Microsoft. Você precisa escolher entre contas na minha organização ou contas em qualquer organização.
A autoridade especificada na configuração do aplicativo deve incluir sua ID de locatário ou um nome de domínio associado à sua organização.
Mesmo que você queira fornecer uma ferramenta de multilocatário, use um ID de locatário ou um nome de domínio, e não common ou organizations com esse fluxo, porque o serviço não pode inferir de maneira confiável qual locatário deve ser usado.
Nas MSAL (Bibliotecas de Autenticação da Microsoft), as credenciais do cliente (segredo ou certificado) são passadas como um parâmetro da construção do aplicativo cliente confidencial.
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 da nuvem e a ID do locatário, juntos compõem aautoridade.
- A ID do cliente que você conseguiu do registro do aplicativo.
- Um segredo de cliente ou um certificado.
Aqui está um exemplo de como definir a configuração em um arquivo de configuração de exemplo appsettings.json. Este exemplo foi extraído do exemplo de código daemon de console do .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 das credenciais de federação de identidade de carga de trabalho.
O exemplo a seguir mostra as constantes de configuração Java para um aplicativo daemon:
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 daamostra do daemon de Node.jsestã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/
Quando você compila um cliente confidencial com segredos do cliente, o arquivo de configuração da amostra de parameters.jsno para o fluxo de segredos do cliente na amostra do daemon Python é o seguinte:
{
"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"
}
Quando você compila um cliente confidencial com certificados, o arquivo de configuração da amostra de parameters.jsno para o fluxo de certificados na amostra do daemon Python é o seguinte:
{
"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 como definir a configuração em um appsettings.json arquivo de configuração do console do daemon. Este exemplo foi extraído do exemplo de código daemon de console do .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ê consegue umClientSecretou umCertificateName. Estas configurações são exclusivas.
Instanciar o aplicativo MSAL
Para instanciar um aplicativo MSAL, adicione, referencie ou importe o pacote MSAL (dependendo do idioma).
A construção é diferente, dependendo de você usar segredos do cliente ou certificados (ou, em um cenário avançado, asserções assinadas).
Adicione uma referência ao pacote
Referencie o pacote MSAL no seu 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.
Seu projeto pode ser o seguinte. O arquivo appsettings.json precisa ser copiado para o diretório de saída.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<RootNamespace>daemon_console</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Identity.Web.GraphServiceClient" Version="2.12.2" />
</ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
No arquivo Program.cs, adicione uma diretiva using em seu código para fazer referência a Microsoft.Identity.Web.
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;
import com.microsoft.aad.msal4j.ClientCredentialFactory;
import com.microsoft.aad.msal4j.ClientCredentialParameters;
import com.microsoft.aad.msal4j.ConfidentialClientApplication;
import com.microsoft.aad.msal4j.IAuthenticationResult;
import com.microsoft.aad.msal4j.IClientCredential;
import com.microsoft.aad.msal4j.MsalException;
import com.microsoft.aad.msal4j.SilentParameters;
Instale os pacotes executando npm install na pasta onde o arquivo package.json reside. Em seguida, importe o pacote msal-node:
const msal = require('@azure/msal-node');
Importe os módulos MSAL e auxiliares necessários no seu aplicativo Python:
import msal
import json
import sys
import logging
Adicione o pacote NuGetMicrosoft. Identity. Clientao seu aplicativo e, em seguida, adicione umausingdiretiva no seu código para referenciá-lo.
No MSAL.NET, o aplicativo cliente confidencial é representado pela interface IConfidentialClientApplication.
using Microsoft.Identity.Client;
IConfidentialClientApplication app;
Instanciar o aplicativo do cliente confidencial por meio do segredo do cliente
Aqui está o código para instanciar a aplicação cliente confidencial com um segredo do cliente:
O exemplo a seguir cria o aplicativo cliente confidencial usando um segredo do cliente com Microsoft. Identity.Web:
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 no appsettings.json:
Use o seguinte código Java para criar um aplicativo cliente confidencial com um segredo do cliente:
IClientCredential credential = ClientCredentialFactory.createFromSecret(CLIENT_SECRET);
ConfidentialClientApplication cca =
ConfidentialClientApplication
.builder(CLIENT_ID, credential)
.authority(AUTHORITY)
.build();
Use a seguinte configuração de Node.js para criar uma instância de um aplicativo cliente confidencial com um segredo do cliente:
const msalConfig = {
auth: {
clientId: process.env.CLIENT_ID,
authority: process.env.AAD_ENDPOINT + process.env.TENANT_ID,
clientSecret: process.env.CLIENT_SECRET,
}
};
const apiConfig = {
uri: process.env.GRAPH_ENDPOINT + 'v1.0/users',
};
const tokenRequest = {
scopes: [process.env.GRAPH_ENDPOINT + '.default'],
};
const cca = new msal.ConfidentialClientApplication(msalConfig);
# 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 exemplo de MSAL.NET a seguir cria um aplicativo cliente confidencial usando o segredo do cliente configurado:
app = ConfidentialClientApplicationBuilder.Create(config.ClientId)
.WithClientSecret(config.ClientSecret)
.WithAuthority(new Uri(config.Authority))
.Build();
AAuthorityé uma concatenação da instância da nuvem e da ID do locatário, por exemplohttps://login.microsoftonline.com/contoso.onmicrosoft.comouhttps://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee. No arquivo appsettings.jsno mostrado na seção Arquivo de configuração, a instância e o locatário são representados pelos valores Instance e Tenant, respectivamente.
No exemplo de código do qual o trecho anterior foi extraído, Authority é uma propriedade da classe AuthenticationConfig e está definida da seguinte forma:
/// <summary>
/// URL of the authority
/// </summary>
public string Authority
{
get
{
return String.Format(CultureInfo.InvariantCulture, Instance, Tenant);
}
}
Instanciar o aplicativo do cliente confidencial por meio do certificado do cliente
Aqui está o código para criar um aplicativo com um certificado:
O código de construção do aplicativo é o mesmo que o exemplo de segredo do cliente. A única diferença é que o certificado é descrito na configuração em vez de um segredo.
Há várias maneiras de obter o certificado. Para obter detalhes, consulte Usar certificados com Microsoft Identity Web.
O exemplo de configuração a seguir mostra como recuperar o certificado de Azure Key Vault. A identidade da Microsoft delega ao 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 porque DefaultAzureCredential usa suas credenciais de desenvolvedor.
"ClientCredentials": [
{
"SourceType": "KeyVault",
"KeyVaultUrl": "https://yourKeyVaultUrl.vault.azure.net",
"KeyVaultCertificateName": "NameOfYourCertificate"
}
No MSAL Java, há dois compiladores para instanciar o aplicativo cliente confidencial com certificados:
InputStream pkcs12Certificate = ... ; /* Containing PCKS12-formatted certificate*/
string certificatePassword = ... ; /* Contains the password to access the certificate */
IClientCredential credential = ClientCredentialFactory.createFromCertificate(pkcs12Certificate, certificatePassword);
ConfidentialClientApplication cca =
ConfidentialClientApplication
.builder(CLIENT_ID, credential)
.authority(AUTHORITY)
.build();
ou
PrivateKey key = getPrivateKey(); /* RSA private key to sign the assertion */
X509Certificate publicCertificate = getPublicCertificate(); /* x509 public certificate used as a thumbprint */
IClientCredential credential = ClientCredentialFactory.createFromCertificate(key, publicCertificate);
ConfidentialClientApplication cca =
ConfidentialClientApplication
.builder(CLIENT_ID, credential)
.authority(AUTHORITY)
.build();
O exemplo de Node.js a seguir configura um aplicativo cliente confidencial para usar um certificado:
const config = {
auth: {
clientId: process.env.CLIENT_ID,
authority: process.env.AAD_ENDPOINT + process.env.TENANT_ID,
clientCertificate: {
thumbprint: process.env.CERTIFICATE_THUMBPRINT, // a 40-digit hexadecimal string
privateKey: process.env.CERTIFICATE_PRIVATE_KEY,
}
}
};
// Create an MSAL application object
const cca = new msal.ConfidentialClientApplication(config);
Para obter detalhes, confira Usar credenciais de certificado com a MSAL Node.
# 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
)
Use o seguinte código MSAL.NET para carregar um certificado e criar o aplicativo cliente confidencial:
X509Certificate2 certificate = ReadCertificate(config.CertificateName);
app = ConfidentialClientApplicationBuilder.Create(config.ClientId)
.WithCertificate(certificate)
.WithAuthority(new Uri(config.Authority))
.Build();
Cenário avançado: Criar o aplicativo cliente confidencial com asserções do cliente
Além de usar um segredo ou certificado do cliente, os aplicativos cliente confidenciais também podem provar sua identidade usando declarações de cliente. Confira CredentialDescription para obter detalhes.
O exemplo de Java a seguir cria um aplicativo cliente confidencial usando uma declaração de cliente:
IClientCredential credential = ClientCredentialFactory.createFromClientAssertion(assertion);
ConfidentialClientApplication cca =
ConfidentialClientApplication
.builder(CLIENT_ID, credential)
.authority(AUTHORITY)
.build();
Use a seguinte configuração de Node.js para inicializar um aplicativo cliente confidencial com uma declaração de cliente:
const clientConfig = {
auth: {
clientId: process.env.CLIENT_ID,
authority: process.env.AAD_ENDPOINT + process.env.TENANT_ID,
clientAssertion: process.env.CLIENT_ASSERTION
}
};
const cca = new msal.ConfidentialClientApplication(clientConfig);
Para obter detalhes, confira Inicializar o objeto ConfidentialClientApplication.
No MSAL Python, você pode fornecer as declarações de cliente usando as declarações que serão assinadas por essa ConfidentialClientApplicationchave privada.
# 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
)
Para obter mais detalhes, consulte a documentação de referência do Python do MSAL em ConfidentialClientApplication.
Em vez de um segredo ou certificado do cliente, o aplicativo cliente confidencial também pode provar sua identidade usando uma declaração de cliente.
O MSAL.NET tem dois métodos para fornecer declarações assinadas pelo aplicativo cliente confidencial:
.WithClientAssertion()
.WithClientClaims()
Ao usar WithClientAssertion, forneça um JWT assinado. Este cenário avançado está detalhado nasDeclarações de cliente.
string signedClientAssertion = ComputeAssertion();
app = ConfidentialClientApplicationBuilder.Create(config.ClientId)
.WithClientAssertion(signedClientAssertion)
.Build();
Quando você usa WithClientClaims, o MSAL.NET produz uma declaração assinada que contém as declarações esperadas pela ID do Microsoft Entra, além das declarações de cliente adicionais que você deseja enviar.
Este código mostra como fazer isso:
string ipAddress = "192.168.1.2";
var claims = new Dictionary<string, string> { { "client_ip", ipAddress } };
X509Certificate2 certificate = ReadCertificate(config.CertificateName);
app = ConfidentialClientApplicationBuilder.Create(config.ClientId)
.WithAuthority(new Uri(config.Authority))
.WithClientClaims(certificate, claims)
.Build();
Para obter detalhes, consulte as declarações do cliente.
Próximas etapas