Вам не нужно создавать исключение / перехват для каждого недопустимого пользователя, как вы делаете в текущем коде. Я не имею ничего против обработки исключений в целом по другим причинам, но чтобы увидеть, существует ли пользователь или нет, вы можете попробовать использовать Filter
.
Таким образом, ваш запрос графа может выглядеть как -
https://graph.microsoft.com/v1.0/users?$filter=startswith(userPrincipalName,'someuser@mytenant.onmicrosoft.com')
Я показал startswith
здесь, потому что eq
не помогло мне в быстром испытании. Хотя я бы порекомендовал две вещи:
Вот модифицированная версия для вашего кода.
Обратите внимание, что я проверяю, чтобы количество собраний было> 0, и не проверяю, чтобы оно было нулевым, поскольку даже в случае, если пользователь не найден, UsersCollectionPage не был нулевым для моего тестового прогона.
using Microsoft.Identity.Client;
using Microsoft.Graph.Auth;
using Microsoft.Graph;
...
private async Task<bool> ValidateAccounts(string accounts) {
var confidentialClientApplication = ConfidentialClientApplicationBuilder
.Create("clientId here")
.WithTenantId("tokenId here")
.WithClientSecret("secret here")
.Build();
var authProvider = new ClientCredentialProvider(confidentialClientApplication);
var graphClient = new GraphServiceClient(authProvider);
var valid = true;
try {
foreach (var account in accounts.Split(';')) {
var user = await graphClient.Users.Request().Filter("startswith(userPrincipalName, '" + account + "')").GetAsync();
if (user.Count <= 0) {
valid = false;
break;
}
}
} catch (ServiceException ex) {
valid = false;
}
return valid;
}
Кстати, я не уверен в ваших требованиях, но вы могли бы проявить творческий подход, объединив несколько имен пользователей в одном запросе, а затем проверив счетчик результатов или другие свойства. Вы можете использовать or
между несколькими критериями или, возможно, использовать оператор any
. Я действительно не пробовал это все же.