簡體   English   中英

Microsoft Graph API 通過email地址獲取多個B2C用戶

[英]Microsoft Graph API get multiple B2C user via email address

我有一個用例,從 Microsoft Graph api 查詢多個 b2c 用戶以獲取顯示名稱並獲取有關上次登錄的信息。 我知道最后一次登錄只能通過測試路線獲得。

我正在使用 microsoft graph api beta 客戶端並嘗試通過 email 地址獲取用戶。

我的 b2c 用戶沒有任何郵件或其他郵件值,只有有關 email 的信息放在身份列表中。

var result = await client.Users
.Request()
.Select(e => new
{
    e.DisplayName,
    e.UserType,
    e.OtherMails,
    e.UserPrincipalName,
    e.Mail,
    e.Identities,
    e.SignInActivity
}).GetAsync();

此調用返回所有用戶,因此我必須在 memory 中進行過濾,這很糟糕。

.Filter("identities/any(id:id/issuer eq 'xxx.onmicrosoft.com' and id/issuerAssignedId eq 'superUser@mail.com')")

此過濾器 function 僅返回一個特定用戶,但我無法通過單個請求查詢多個用戶。 .Filter("identities/any(id:id/issuer eq 'xxx.onmicrosoft.com' and id/issuerAssignedId eq 'superUser@mail.com') or identities/any(id:id/issuer eq 'xxx.onmicrosoft.com' and id/issuerAssignedId eq 'superUser2@mail.com')")返回查詢是復雜的,將 'eq' 替換為 'in' 返回不支持的查詢,因為看起來 lambda 運算符不支持 'in '.

有人知道如何通過單個請求查詢例如 2 個電子郵件地址嗎?

我還可以提供一個 rosly pad 腳本,您只需設置您的特定值,如客戶端 ID、密碼等。

#r "nuget:Microsoft.Graph.Auth/1.0.0-preview.7"
#r "nuget:Microsoft.Graph.Beta/4.28.0-preview"

#r "nuget:RestSharp/107.1.1"
#r "nuget:RestRequest/1.2.0"
#r "nuget:Microsoft.Azure.Services.AppAuthentication/1.6.2"
#r "nuget:Azure.Core/1.22.0"
#r "nuget:Azure.Identity/1.5.0"

using Microsoft.Graph;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System.Net.Http.Headers;
using Azure.Identity;
using System.Linq;
using Azure.Core;
using Microsoft.Graph.Auth;
using Microsoft.Identity.Client;

using System.Net.Http;


var client = await GetGraphApiClient();

var emails = new []{  "email1@example.de","email2@example.de","email3@example.de","email4@example.de","email5@example.de"};

// Build the batch
var batchRequestContent = new BatchRequestContent();

// Using AddBatchRequestStep adds each request as a step
foreach (var element in emails)
{
    var userRequest2 = client.Users
        .Request()
        .Select(e => new
        {
            e.DisplayName,
            e.UserType,
            e.OtherMails,
            e.UserPrincipalName,
            e.Mail,
            e.Identities,
            e.SignInActivity // just provided in the Microsoft.Graph.Beta package 
        })
    .Filter($"identities/any(id:id/issuer eq ' ' and id/issuerAssignedId eq '{element}')");
    batchRequestContent.AddBatchRequestStep(userRequest2);
}

var returnedResponse = await client.Batch.Request().PostAsync(batchRequestContent);

try
{
    var user = await returnedResponse
        .GetResponsesAsync();
    user.Dump();
}
catch (ServiceException ex)
{
    Console.WriteLine($"Failed to get user: {ex.Error.Message}");
}

private static async Task<GraphServiceClient> GetGraphApiClient()
{
    var clientId = "<Client-Id-Of-your-app-with-graph-access>";
    var secret = "<Client-Secret-Of-your-app-with-graph-access>";
    var tenant = "<tenant-id>";

    string[] scopes = new string[] { "AuditLog.Read.All", "User.Read.All" };

    IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
            .Create(clientId)
            .WithTenantId(tenant)
            .WithClientSecret(secret)
            .Build();
    ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);

var serviceToken = await authProvider.ClientApplication.AcquireTokenForClient(new string[] { "https://graph.microsoft.com/.default" }).ExecuteAsync();

    return new GraphServiceClient(authProvider);

}



謝謝丹斯坦,

通過批量請求,它可以一次獲得最多 20 個帳戶的單個請求。 https://learn.microsoft.com/en-us/graph/sdks/batch-requests?tabs=csharp#simple-batching-example API 仍然將其限制為單個批處理請求中的 20 個請求。 “代碼:MaximumValueExceeded 消息:批處理請求步驟數超過最大值 20。”

這使得通過視圖請求查詢所有數據成為可能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM