У меня есть приложение администратора, написанное на C# с расширением Microsoft.Graph.Beta
, и оно использует .Request(), чтобы разрешить просмотр и поиск пользователей из B2C. У меня есть отдельное приложение, которое использует новые 5.52.0 Microsoft Graph
и Azure.Identity
, которые можно использовать для добавления и обновляйте пользователей в B2C, используя метод Users.PostAsync
. Поскольку это более безопасное приложение, мне нужно перенести функции первого приложения, но новый Graph, похоже, сделал .Request() избыточным, что является единственным известным мне методом получения данных из B2C.
Вот код просмотра из первого приложения -
public static async Task ListUsers(GraphServiceClient graphClient)
{
Console.WriteLine("Getting list of users...");
// Get all users (one page)
var result = await graphClient.Users
.Request()
.Select(e => new
{
e.DisplayName,
e.Id,
e.Identities,
e.BusinessPhones
})
.GetAsync();
// Calculate maximum lengths
int maxDisplayNameLength = result.CurrentPage.Max(u => u.DisplayName.Length);
int maxIdLength = result.CurrentPage.Max(u => u.Id.Length);
int maxEmailLength = result.CurrentPage
.Where(u => u.Identities.Any(i => i.SignInType == "emailAddress")) // Filter users with email addresses
.Select(u => u.Identities.FirstOrDefault(i => i.SignInType == "emailAddress")?.IssuerAssignedId)
.Where(email => email != null)
.Max(email => email.Length);
bool isFirst = true;
foreach (var user in result.CurrentPage)
{
// Get email if available
string email = user.Identities.FirstOrDefault(i => i.SignInType == "emailAddress")?.IssuerAssignedId;
// If user has no email, skip to the next iteration
if (email == null)
continue;
// Get phone numbers
string phoneNumbers = string.Join(", ", user.BusinessPhones);
if (isFirst)
{
Console.WriteLine("------------------------");
isFirst = false;
}
// Format output with alignment based on maximum lengths
Console.WriteLine($"DisplayName: {user.DisplayName.PadRight(maxDisplayNameLength)}");
Console.WriteLine($"Id: {user.Id.PadRight(maxIdLength)}");
Console.WriteLine($"Email: {email?.PadRight(maxEmailLength) ?? string.Empty}");
Console.WriteLine($"Phone Numbers: {phoneNumbers}"); // Display phone numbers
Console.WriteLine("------------------------"); // Add a line separator
}
}
Это работает безупречно в старой версии Graph, но мне нужно перенести его в новое приложение по соображениям безопасности. Ниже представлена попытка использовать ту же логику в новом приложении, и если ее запустить, вы заметите, что она выдает ошибки, связанные с .Request() -
`static async Task ListUsers()
{
var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "...";
var clientId = "...";
var clientSecret = "...";
var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
try
{
// Retrieve users from Microsoft Graph
var users = await graphClient.Users.Request().GetAsync();
// Display user details
foreach (var user in users)
{
Console.WriteLine($"Display Name: {user.DisplayName}");
Console.WriteLine($"Given Name: {user.GivenName}");
Console.WriteLine($"Surname: {user.Surname}");
Console.WriteLine($"Email Address: {user.Mail}");
Console.WriteLine($"Business Phone Number: {user.BusinessPhones?[0]}");
Console.WriteLine();
}
}
catch (Exception ex)
{
Console.WriteLine($"Error listing users: {ex.Message}");
}
}`
Есть ли в современном Graph новый метод для замены этого?
Спасибо, да, я в курсе, ищу альтернативу, если она известна.
AFAIK альтернативы нет, это зависит от версии
так современный Graph не может получить данные из B2C? Это не кажется логичным.
Он может получить данные, изменив код, используя await graphClient.Users.GetAsync();
Проверьте это github.com/microsoftgraph/msgraph-sdk-dotnet/blob/feature/5.0/…
это затем выдает ошибку в верхней части цикла foreach. Оператор foreach CS1579 не может работать с переменными типа UserCollectionResponse, поскольку UserCollectionResponse не содержит общедоступного экземпляра или определения расширения для GetEnumerator.
Опубликую ответ с правильным кодом
Обратите внимание: Request()
удален из последней версии Microsoft Graph, поэтому вам необходимо удалить Request()
из кода, чтобы устранить ошибку. Обратитесь к этому блогу GitHub.
Чтобы устранить ошибку, измените код, как показано ниже:
using Microsoft.Graph;
using Azure.Identity;
class Program
{
static async Task Main()
{
string tenantId = "TenantID";
string clientId = "ClientID";
string clientSecret = "ClientSecret";
var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential);
try
{
var users = await graphClient.Users.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Select = new string[] { "displayName", "GivenName", "Surname", "Mail" };
});
foreach (var user in users.Value)
{
Console.WriteLine($"Display Name: {user.DisplayName}");
Console.WriteLine($"Given Name: {user.GivenName}");
Console.WriteLine($"Surname: {user.Surname}");
Console.WriteLine($"Street Address: {user.Mail}");
Console.WriteLine(" ");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error listing users: {ex.Message}");
}
}
}
Ты абсолютный гений, я не могу отблагодарить тебя!!
В последних версиях модуля Microsoft Graph Request() удален и выдает ошибку. Чтобы устранить ошибку, не передавайте Request()