Извините, что беспокою еще раз, но я пытаюсь реализовать поиск по адресу электронной почты в приложении, используя ту же логику, что и функция просмотра пользователей, которая была чудесно исправлена для меня вчера (.Request() не работает на C# с Azure AD B2C), но, похоже, это работает по-другому. Скорее всего, я сделал это неправильно, но мне нужна помощь, потому что я не могу найти ответ в Microsoft Learn, а
Я попробовал эту функцию -
public static async Task SearchUsers()
{
var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "...";
var clientId = "...";
var clientSecret = "...";
ClientSecretCredential clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
Console.Write("Enter user email address: ");
string emailAddress = Console.ReadLine();
Console.WriteLine($"Looking for user with email address '{emailAddress}'...");
try
{
var users = await graphClient.Users
.GetAsync(requestConfiguration =>
{
requestConfiguration.QueryParameters.Select = new string[] { "id", "displayName", "givenName", "surname", "businessPhones", "identities" };
requestConfiguration.QueryParameters.Filter = $"identities/any(c:c/issuerAssignedId eq '{emailAddress}' and c/signInType eq 'emailAddress')";
});
if (users != null && users.Value.Any())
{
var user = users.Value.FirstOrDefault();
if (user != null)
{
Console.WriteLine("------------------------");
Console.WriteLine($"ID: {user.Id}");
Console.WriteLine($"Display Name: {user.DisplayName}");
Console.WriteLine($"Given Name: {user.GivenName}");
Console.WriteLine($"Surname: {user.Surname}");
Console.WriteLine($"Email: {emailAddress}");
// Check if business phone numbers are available
if (user.BusinessPhones != null && user.BusinessPhones.Any())
{
Console.Write("Business Phones: ");
Console.WriteLine(string.Join(", ", user.BusinessPhones));
}
else
{
Console.WriteLine("Business Phones: N/A");
}
Console.WriteLine();
}
else
{
Console.WriteLine("No user found with the provided email address.");
}
}
else
{
Console.WriteLine("No user found with the provided email address.");
}
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"Error: {ex.Message}");
Console.ResetColor();
}
}
Для справки, это функция ListUsers(), на которой я основываюсь:
`public static async Task ListUsers() { Console.WriteLine("Получение списка пользователей...");
var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "...";
var clientId = "...";
var clientSecret = "...";
ClientSecretCredential clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
try
{
var users = await graphClient.Users.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Select = new string[] { "Id", "displayName", "GivenName", "Surname", "BusinessPhones", "Identities"};
});
foreach (var user in users.Value)
{
// Extract email address from identities
var emailAddress = user.Identities?.FirstOrDefault(i => i.SignInType == "emailAddress")?.IssuerAssignedId;
// Skip user if no email address is found
if (string.IsNullOrEmpty(emailAddress))
continue;
Console.WriteLine("------------------------");
Console.WriteLine($"ID: {user.Id}");
Console.WriteLine($"Display Name: {user.DisplayName}");
Console.WriteLine($"Given Name: {user.GivenName}");
Console.WriteLine($"Surname: {user.Surname}");
Console.WriteLine($"Email: {emailAddress}");
// Check if business phone numbers are available
if (user.BusinessPhones != null && user.BusinessPhones.Any())
{
Console.Write("Business Phones: ");
Console.WriteLine(string.Join(", ", user.BusinessPhones));
}
else
{
Console.WriteLine("Business Phones: N/A");
}
Console.WriteLine();
}
}
catch (Exception ex)
{
Console.WriteLine($"Error listing users: {ex.Message}");
}
Это работает для вас? Проверьте это
попробовал, но адрес электронной почты является идентификатором, как показано в приведенном выше коде ListUsers().
Можете ли вы кратко изложить ваши требования?
нужна функция поиска на основе личности пользователя, которая представляет собой адрес электронной почты, показанный здесь imgur.com/a/nozHet0
Конечно, опубликую ответ





Чтобы найти или получить пользователей по их адресу электронной почты/личности пользователя, измените код, как показано ниже:
using Azure.Identity;
using Microsoft.Graph;
static async Task SearchUsers()
{
var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "TenantID";
var clientId = "ClientID";
var clientSecret = "ClientSecret";
ClientSecretCredential clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
try
{
var result = await graphClient.Users.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Select = new string[] { "displayName", "identities", "GivenName", "Surname", "Mail" };
requestConfiguration.QueryParameters.Filter = "identities/any(c:c/issuerAssignedId eq '[email protected]' and c/issuer eq '[email protected]')";
});
if (result.Value != null && result.Value.Any())
{
foreach (var user in result.Value)
{
Console.WriteLine($"Display Name: {user.DisplayName}");
Console.WriteLine($"Given Name: {user.GivenName}");
Console.WriteLine($"Surname: {user.Surname}");
Console.WriteLine($"Email: {user.Mail}");
Console.WriteLine(" ");
}
}
else
{
Console.WriteLine("No users found with the specified criteria.");
}
}
catch (ServiceException ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"Graph API Error: {ex.Message}");
Console.ResetColor();
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"Error: {ex.Message}");
Console.ResetColor();
}
}
await SearchUsers();
Я могу успешно получить подробную информацию, передав адрес электронной почты/личность пользователя:

Глас, что это сработало :)
В общем, можно ли использовать ту же логику в WinForms, а не в консоли?
Да, его можно использовать
^ Я отредактировал приведенный выше код, добавив решение, которое не содержит серьезных ошибок, но по-прежнему не извлекает никаких данных.