Мы переходим на аутентификацию по сертификату клиента в нашем приложении и в настоящее время работаем над получением количества удаленных объектов приложения из API Microsoft Graph, следуя https://learn.microsoft.com/en-us/graph/sdks/choose- поставщики-аутентификации#поставщик-учетных данных-клиента. Вот код, который мы разработали на данный момент:
var scopes = new[] { "https://graph.microsoft.com/.default" };
var clientId = "YOUR_CLIENT_ID";
var tenantId = "YOUR_TENANT_ID";
var clientCertificate = new X509Certificate2("MyCertificate.pfx");
var options = new ClientCertificateCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};
var clientCertCredential = new ClientCertificateCredential(
tenantId, clientId, clientCertificate, options);
var graphClient = new GraphServiceClient(clientCertCredential, scopes);
try
{
var result = await graphClient.Directory.DeletedItems.GraphApplication.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Count = true;
requestConfiguration.QueryParameters.Orderby = new string[] { "deletedDateTime asc" };
requestConfiguration.QueryParameters.Select = new string[] { "id", "displayName", "deletedDateTime" };
requestConfiguration.Headers.Add("Consistencylevel", "Eventual");
});
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
Однако при попытке составить список удаленных приложений мы сталкиваемся со следующим исключением:
Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: «Указанный сетевой пароль неверен».
Мы убедились, что вызывающему приложению предоставлены необходимые разрешения, включая Directory.Read.All и Application.Read.All.
Не могли бы вы помочь определить проблему и дать рекомендации по ее решению? Любая помощь будет принята с благодарностью.
Я согласен с @user2250152, вам необходимо передать закрытый ключ вместе с путем к сертификату при использовании аутентификации по сертификату клиента.
В моем случае я создал сертификаты с закрытым ключом, используя следующие команды PowerShell:
$certname = "graphcert03"
$cert = New-SelfSignedCertificate -Subject "CN=$certname" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256
Export-Certificate -Cert $cert -FilePath "C:/demo/$certname.cer" ## Specify your preferred location
$mypwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath "C:/demo/$certname.pfx" -Password $mypwd
Ответ:
Теперь я загрузил этот сертификат при регистрации вызывающего приложения, у которого есть необходимые разрешения, такие как Application.Read.All:
Когда я запустил приведенный ниже модифицированный код, включив закрытый ключ в сертификат, я получил ответ с ожидаемыми результатами, подобным этому:
using Azure.Identity;
using Microsoft.Graph;
using System.Security.Cryptography.X509Certificates;
var scopes = new[] { "https://graph.microsoft.com/.default" };
var clientId = "appID";
var tenantId = "tenantId";
// Load certificate from file
var certificatePath = "C:/demo/graphcert03.pfx";
var certificatePassword = "password"; // Provide the password here
var clientCertificate = new X509Certificate2(certificatePath, certificatePassword);
// using Azure.Identity;
var options = new ClientCertificateCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};
var clientCertCredential = new ClientCertificateCredential(
tenantId, clientId, clientCertificate, options);
var graphClient = new GraphServiceClient(clientCertCredential, scopes);
var apps= await graphClient.Directory.DeletedItems.GraphApplication.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Count = true;
requestConfiguration.QueryParameters.Orderby = new string[] { "deletedDateTime asc" };
requestConfiguration.QueryParameters.Select = new string[] { "appId", "DisplayName", "deletedDateTime" };
requestConfiguration.Headers.Add("Consistencylevel", "Eventual");
});
Console.WriteLine($"Total deleted apps: {apps.OdataCount}\n");
foreach (var app in apps.Value)
{
Console.WriteLine($"App ID: {app.AppId}");
Console.WriteLine($"Application Name: {app.DisplayName}");
Console.WriteLine($"Deleted Date and Time: {app.DeletedDateTime}");
Console.WriteLine();
}
Ответ:
Чтобы убедиться в этом, я проверил на портале, где общее количество регистраций удаленных приложений такое же, как показано ниже:
Спасибо, это действительно работает! У нас есть еще одно требование: вернуть несколько удаленных приложений. Не могли бы вы выделить время, чтобы помочь нам и с этой частью? Большое спасибо за ваше время! действительно ценю это !!
По новым требованиям Вы можете оставлять новые вопросы, о которых сообщество позаботится отдельно.
Отмечено @NaveenSharma. Мы зададим новый вопрос, спасибо!
@NaveenSharma Мы задали здесь новый вопрос stackoverflow.com/questions/78190704/… Пожалуйста, помогите
@user10563489 user10563489 Я добавил на него ответ, вы можете проверить там и сообщить мне, работает ли он!
@Sridevi Спасибо, ваш код снова работает отлично!
Похоже, сертификат защищен закрытым ключом, и вы не указали ключ для сертификата.