gpt4 book ai didi

Azure B2C - 如何从 Microsoft Graph 获取用户详细信息?

转载 作者:行者123 更新时间:2023-12-02 23:35:04 59 4
gpt4 key购买 nike

我正在学习/试验 Azure Active Directory B2C (AADB2C)。我创建了一个 Web 应用程序,可以使用 OpenID Connect 登录或注册用户(不使用自定义用户流程)。

用户登录后,我想调用 Microsoft Graph 以获取有关登录用户的信息。

根据文档,我初始化客户端凭据身份验证提供程序,如下所示:

var scopes = new[] { "https://graph.microsoft.com/.default" };

var clientSecretCredential = new ClientSecretCredential(config.TenantId, config.AppId, config.ClientSecret);

var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

然后我尝试提出请求,如下所示:

var user = await graphClient.Me.Request().GetAsync();

上述结果导致异常:

Code: BadRequest
Message: /me request is only valid with delegated authentication flow.

当我尝试以下操作时:

var user = await graphClient.Users[ '' ].Request().GetAsync();

上述结果导致异常:

Code: Authorization_RequestDenied
Message: Insufficient privileges to complete the operation.

很多MS文档中的示例都说明必须授予“User.Read”权限,但是在使用Azure Portal时找不到“User.Read”权限,下面是Azure 门户中“请求 API 权限”边栏选项卡的屏幕快照 - 我仍然不清楚注释(在下图中突出显示)。

Azure Portal trying to add User.Read permission

当我尝试输入“User.Read”权限时,会显示以下内容:

User.Read permission not found

我还找到了关于 how to Register a Microsoft Graph application 的教程,但它似乎适合想要访问图表的管理员,而不是“常规”登录用户本身。

我的问题 - 是否有任何工作示例说明如何(在用户登录后)从 Microsoft Graph 读取用户信息?

最佳答案

Note that, web applications registered with supported account type as Accounts in any identity provider or organizational directory (for authenticating users with user flows) supports only Microsoft Graph offline_access and openid delegated permissions.

我尝试在我的环境中重现相同的结果并得到以下结果:

我通过选择支持的帐户类型在我的 B2C 租户中注册了一个应用程序,如下所示:

enter image description here

当我使用相同的代码从客户端凭据流获取登录用户配置文件时,我收到相同的错误,因为此流不支持委派权限。

using Microsoft.Graph;
using Azure.Identity;

var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "srib2corg.onmicrosoft.com";
var clientId = "7427462d-b6e1-4ab0-ba0c-xxxxxxxx";
var clientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var clientSecretCredential = new ClientSecretCredential(
tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
var user = await graphClient.Me.Request().GetAsync();

回应:

enter image description here

以下命令是获取我遇到相同错误的用户列表,因为我没有所需的权限,如下所示:

var user = await graphClient.Users["userID"].Request().GetAsync();

回应:

enter image description here

要获取登录的用户个人资料,您需要在 B2C 应用程序中添加委托(delegate)的 User.Read 权限,但由于您受支持的帐户,该权限不可用类型:

enter image description here

解决此问题,您需要使用支持的帐户类型作为单租户/ Multi-Tenancy 来创建应用注册,如下所示:

enter image description here

在上面的应用程序中,您可以添加委托(delegate)User.Read权限,如下所示:

enter image description here

由于客户端凭据流程不适用于委派权限,因此您需要将流程更改为委派流程,例如授权码、用户名密码等...

就我而言,我更改为用户名密码流程并使用以下代码来获取用户个人资料:

using Microsoft.Graph;
using Azure.Identity;

var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "srib2corg.onmicrosoft.com";
var clientId = "7d983e16-5296-4056-8e72-xxxxxxxx";

var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};

var userName = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="58393c353136182b2a313a6a3b372a3f76373635313b2a372b373e2c763b3735" rel="noreferrer noopener nofollow">[email protected]</a>";
var password = "xxxxxxxxx";

var userNamePasswordCredential = new UsernamePasswordCredential(
userName, password, tenantId, clientId, options);

var graphClient = new GraphServiceClient(userNamePasswordCredential, scopes);

var user = await graphClient.Me.Request().GetAsync();

Console.WriteLine("\nName: " + user.DisplayName);
Console.WriteLine("\nID: " + user.Id);
Console.WriteLine("\nUPN: " + user.UserPrincipalName);

回应:

enter image description here

如果您的用例是在用户登录网络应用程序后获取个人资料,您可以查看下面我最近回答的SO thread

Signed-in user Profile page in ASP.NET Core Web App calling the Microsoft Graph - Stack Overflow

关于Azure B2C - 如何从 Microsoft Graph 获取用户详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75077793/

59 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com