Os aplicativos daemon usam permissões do aplicativo em vez das permissões do avaliador delegado. 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 ser o locatário (especificando uma ID de locatário ou um nome de domínio associado à sua organização).
Mesmo que você queira fornecer uma ferramenta de multilocatário, deverá usar uma ID de locatário ou um nome de domínio, e nãocommon ou organizations com esse fluxo, porque o serviço não poderá inferir de maneira confiável qual locatário deve ser usado.
Configurar e criar uma instância do aplicativo
Nas bibliotecas MSAL, as credenciais do cliente (segredo ou certificado) são passadas como um parâmetro da construção do aplicativo do 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
A configuração do arquivo descreve:
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 ou outro, um segredo do cliente ou um certificado.
{
"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]"
}
]
}
}
# 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, oparameters.jsnoarquivo de configuração na amostra dodaemon 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 por meio dos segredos do cliente, oparameters.jsnoarquivo de configuração na amostra dodaemon 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"
}
{
"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 de objeto é diferente, dependendo se você estiver usando os segredos ou certificados do cliente (ou, como um cenário avançado, declarações assinadas).
Referencie o pacote
Referencie o pacote MSAL no seu código do aplicativo.
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
)
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.
Na amostra do código,o snippet de código anterior foi obtido de,Authorityuma propriedade na classeAuthenticationConfig e é definido como tal:
/// <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
Eis o código para compilar um aplicativo de um certificado:
O código em si é exatamente o mesmo. O certificado está descrito na configuração.
Há várias maneiras de obter o certificado. Para obter detalhes, consulte https://aka.ms/ms-id-web-certificates.
Veja como você pode obter o certificado do KeyVault. 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, 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 do cliente, os aplicativos cliente confidenciais também podem provar sua identidade usando declarações de cliente. Confira CredentialDescription para obter detalhes.
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
)
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: