使用 MS 图形 API 获取用户的信息



我正在尝试使用c#的图形API SDK来获取我的信息(这个想法是应用程序在没有用户交互的情况下运行),如下面的代码示例所示:

IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
.Create("xxx")
.WithTenantId("xxx")
.WithClientSecret("xxx")
.Build();
ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);

GraphServiceClient graphClient = new GraphServiceClient(authProvider);
var user = await graphClient.Me.Request()
.Select(u => new
{
u.DisplayName,
u.Mail,
u.UserPrincipalName
})
.GetAsync();

状态返回'WaitingForActivation',我不知道问题在哪里

这不是你想的那样。如果呼叫/me端点,需要登录用户。它实际上获取登录的用户信息,因此您不能使用客户端凭据流获取访问令牌。对于客户端凭证流,它通常用于服务器到服务器的交互,这些交互必须在后台运行,并且不会立即与用户交互(没有用户登录)。对于/me端点,它需要接受用户令牌,因为它具有用户交互。因此,我建议您使用授权码流程来获取访问令牌,这需要您登录用户并获取授权码,然后使用授权码来兑换访问令牌。

授权码提供者:

IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
.Create(clientId)
.WithRedirectUri(redirectUri)
.WithClientSecret(clientSecret) // or .WithCertificate(certificate)
.Build();
AuthorizationCodeProvider authProvider = new AuthorizationCodeProvider(confidentialClientApplication, scopes);

顺便说一下,如果您想在没有用户登录的情况下获取用户信息,您可以调用/users端点:

IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
.Create("xxx")
.WithTenantId("xxx")
.WithClientSecret("xxx")
.Build();
ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);

GraphServiceClient graphClient = new GraphServiceClient(authProvider);
var user = await graphClient.Users["{userId or userPrincipalName}"].Request()
.Select(u => new
{
u.DisplayName,
u.Mail,
u.UserPrincipalName
})
.GetAsync();

最新更新