Управляющие программы используют разрешения приложений, а не делегированные разрешения. Поэтому поддерживаемый ими тип учетной записи не может быть учетной записью в любом каталоге организации или личной учетной записью Майкрософт (например, Skype, Xbox, Outlook.com). Администратора клиентов для предоставления согласия управляющей программе для личной учетной записи Майкрософт не существует. Вам нужно выбрать учетные записи в моей организации или учетных записях в любой организации.
Центр, указанный в конфигурации приложения, должен быть арендован (указано идентификатор клиента или доменное имя, связанное с вашей организацией).
Даже если вы хотите предоставить мультитенантное средство, следует использовать идентификатор клиента или доменное имя, а неcommonorganizations с этим потоком, так как служба не может надежно определить, какой клиент следует использовать.
Настройка и создание экземпляра приложения
В библиотеках MSAL учетные данные клиента (секрет или сертификат) передаются в качестве параметра для создания конфиденциального клиентского приложения.
Внимание
Даже если приложение является консольным и работает как служба, то, если это управляющее приложение, оно должно быть конфиденциальным клиентским приложением.
Файл конфигурации
Файл конфигурации определяет:
Облачный экземпляр и идентификатор клиента, которые вместе образуют права.
Идентификатор клиента, полученный при регистрации приложения.
{
"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]"
}
]
}
}
Вы предоставляете сертификат вместо секрета клиента или учетные данные федерации удостоверений рабочей нагрузки.
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"
}
{
"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]"
}
Вы предоставляете ClientSecret либо CertificateName. Эти параметры являются эксклюзивными.
Создание экземпляра приложения MSAL
Чтобы создать экземпляр приложения MSAL, добавьте, вызовите или импортируйте пакет MSAL (в зависимости от языка).
Конструкция отличается в зависимости от того, используете вы клиентские секреты или сертификаты (или, в качестве расширенного сценария, подписанные утверждения).
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
)
Authority — это объединение облачного экземпляра и идентификатора клиента, например https://login.microsoftonline.com/contoso.onmicrosoft.com или https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee. В файле appsettings.json, показанном в разделе "Файл конфигурации", экземпляр и клиент представлены соответственно значениями Instance и Tenant значениями.
В образце кода, взятом из предыдущего фрагмента, Authority является свойством класса AuthenticationConfig и определяется следующим образом:
/// <summary>
/// URL of the authority
/// </summary>
public string Authority
{
get
{
return String.Format(CultureInfo.InvariantCulture, Instance, Tenant);
}
}
Создание экземпляра конфиденциального клиентского приложения с сертификатом клиента
Ниже приведен код для создания приложения с сертификатом.
Сам код точно такой же. Сертификат описан в конфигурации.
Существует множество способов получения сертификата. Дополнительные сведения см. в разделе https://aka.ms/ms-id-web-certificates.
Вот как вы будете делать, чтобы получить сертификат из KeyVault. Удостоверений Майкрософт делегирует удостоверение Azure DefaultAzureCredential и использует управляемое удостоверение, если он доступен для доступа к сертификату из KeyVault. Вы можете отлаживать приложение локально, так как затем использует учетные данные разработчика.
# 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
)
Помимо использования секрета клиента или сертификата конфиденциальные клиентские приложения также могут подтвердить свою личность с помощью утверждений клиента. Дополнительные сведения см. в разделе CredentialDescription .
В MSAL Python можно предоставить клиентские заявки с помощью утверждений, которые будут подписаны этим закрытым ключом 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
)
Вместо секрета клиента или сертификата конфиденциальное клиентское приложение также может подтвердить свою подлинность с помощью утверждений клиента.
MSAL.NET имеет два метода для предоставления подписанных утверждений для конфиденциального клиентского приложения:
.WithClientAssertion()
.WithClientClaims()
При использовании WithClientAssertion предоставьте подписанный JWT. Этот расширенный сценарий подробно описан в разделе Проверочные утверждения клиента.
При использовании WithClientClaimsMSAL.NET создает подписанное утверждение, содержащее утверждения, ожидаемые идентификатором Microsoft Entra, а также дополнительные утверждения клиента, которые нужно отправить.
В этом коде показано, как это сделать: