Я пытаюсь получить Entra Id пользователя с его адреса электронной почты, прежде чем добавлять его в определенную группу с помощью API Microsoft Graph через веб-приложение .Net.
На портале Azure я зарегистрировал приложение и создал секрет клиента для использования потока аутентификации учетных данных клиента. Для разрешений API мне предоставлены User.Read и User.Read.All в клиенте нашей компании.
Я создаю свой GraphServiceClient, используя следующий код:
public MicrosoftGraphService(IConfiguration configuration)
{
var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = configuration["MicrosoftGraph:TenantId"];
var clientId = configuration["MicrosoftGraph:ClientId"];
var clientSecret = configuration["MicrosoftGraph:Secret"];
var options = new ClientSecretCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret, options);
_graphServiceClient = new GraphServiceClient(clientSecretCredential, scopes);
}
Я вызываю API Graph, передавая адрес электронной почты, пытаясь получить объект пользователя, где я могу прочитать идентификатор Entra. Я делаю это, используя следующий код:
public async Task<GraphUser> GetUserAsync(string emailAddress)
{
try
{
var foundUser = await _graphServiceClient.Users[emailAddress].GetAsync();
var user = (new GraphUser()
{
UserId = foundUser.Id,
DisplayName = foundUser.DisplayName,
Email = emailAddress
});
return user;
}
catch
{
// Not found in AD
return null;
}
}
Однако, когда он вызывает вызов _graphServiceClient.Users[emailAddress].GetAsync(), я получаю сообщение об ошибке: «Недостаточно привилегий для завершения операции».
Из документации, которую я прочитал, наличие разрешения API User.Read.All, предоставленного приложению, должно быть достаточным для получения данных. Что я делаю не так?
Я добавил предоставленные разрешения.
Пожалуйста, проверьте ответ ниже. Вам необходимо предоставить разрешение API типа приложения User.Read.All, поскольку вы используете поток учетных данных клиента.
@Рукмини, спасибо. Теперь я вижу ошибку. У меня есть делегированное разрешение Read.User.All, а не разрешение уровня приложения. Спасибо за вашу помощь.





Ошибка «Недостаточно прав для завершения операции» обычно возникает, если приложение Microsoft Entra ID не имеет необходимых разрешений для выполнения действия.
Первоначально я получил ту же ошибку:

Чтобы устранить эту ошибку, обязательно предоставьте User.Read.All разрешение API типа приложения, поскольку вы используете поток учетных данных клиента.
User.Read.All Разрешение API делегированного типа должно быть предоставлено, когда вы используете интерактивный поток пользователя.Предоставьте разрешение API типа приложения User.Read.All, как показано ниже:

Я могу успешно получить пользователей с UPN, как показано ниже:
using Microsoft.Graph;
using Azure.Identity;
using Microsoft.Graph.Models.ODataErrors;
class Program
{
static async Task Main(string[] args)
{
var scopes = new[] { "https://graph.microsoft.com/.default" };
var clientId = "ClientID";
var tenantId = "TenantID";
var clientSecret = "ClientSecret";
var options = new ClientSecretCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};
var clientSecretCredential = new ClientSecretCredential(
tenantId, clientId, clientSecret, options);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
try
{
var result = await graphClient.Users["[email protected]"].GetAsync();
Console.WriteLine($"User details: {result.DisplayName}, {result.Mail}, {result.Id}");
}
catch (ODataError odataError)
{
Console.WriteLine(odataError.Error?.Code);
Console.WriteLine(odataError.Error?.Message);
throw;
}
}
}

Ссылка:
Можете ли вы прикрепить снимок экрана с разрешениями API, предоставленными приложению Microsoft Entra?