繁体   English   中英

从 Azure B2C 访问 Microsoft Graph API

[英]Access Microsoft Graph API from Azure B2C

我有一个正在运行应用程序的 Azure AD B2C 租户。 它配置为仅使用 Azure AD 和 Microsoft 帐户登录。 此应用程序由 App Center Auth 使用。

我想使用相同的登录名从我的移动应用程序访问一些 Microsoft API(Microsoft Graph API、Azure DevOps API)。 因此,我将 API 权限(Azure DevOps -> user_impersonation 和 Microsoft Graph -> User.Read)添加到我的 Azure AD 租户(不是 B2C 租户)中的应用程序,以在登录时授予这些权限。

如果我现在尝试在我的应用程序中登录后使用访问令牌来访问例如 Microsoft Graph 中的用户,我会收到一个未经授权的错误。

// Sign-in succeeded, UserInformation is not null.
var userInfo = await Auth.SignInAsync();

// Get tokens. They are not null.
var idToken = userInfo.IdToken;
var accessToken = userInfo.AccessToken;

在相同的方法中,我尝试从 Microsoft Graph 获取用户照片

var graphAPIEndpoint = "https://graph.microsoft.com/v1.0/me";
var scopes = new[] { "user.read" };

var client = new HttpClient();

var request = new HttpRequestMessage(HttpMethod.Get, graphAPIEndpoint + "/photo/$value");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var response = await client.SendAsync(request);
var image = await response.Content.ReadAsByteArrayAsync();

UserImage.Source = ImageSource.FromStream(() => new MemoryStream(image));

有没有人建议如何配置 B2C/Azure AD 应用程序以使用访问令牌访问这些 API? 还是我走错了路?

正如@juunas 所说,截至今天,您需要使用 AAD Graph API 来访问 Azure AD B2C 租户,这与 Microsoft Graph API 不同。

这是此文档: https : //docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet

查看发布的有关使用 Microsoft Graph API 并针对 B2C 实例对其进行身份验证的文档:

https://docs.microsoft.com/en-us/azure/active-directory-b2c/microsoft-graph-get-started?tabs=applications

随着最近从login.microsoftonline.com迁移到*.b2clogin.com ,如果您使用 MSAL 从 AAD B2C 实例获取身份验证令牌,则需要覆盖权限配置并关闭权限验证,如这个文件:

https://docs.microsoft.com/bs-latn-ba/azure/active-directory/develop/msal-b2c-overview

在 JavaScript 中,这是按如下方式完成的:

 const msalConfig = {
     auth: {
         clientId: "e760cab2-b9a1-4c0d-86fb-ff7084abd902" //This is your client/application ID
         authority: "https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/b2c_1_susi", //This is your tenant info
         validateAuthority: false
     },
 };

 // create UserAgentApplication instance
 const myMSALObj = new Msal.UserAgentApplication(msalConfig);

在带有 MSAL.NET 库的 C# 中,它将使用传递给PublicClientApplication类构造函数的授权 URL 来完成。

我能够使用以下步骤使用 Graph REST API,

  1. 获取访问令牌,POST URL: https : {"client_id": <Registered application clientId>, "client_secret": <Registered application generated secret>, "scope": "https://graph.microsoft.com/.default", "grant_type": "client_credentials" form-data: {"client_id": <Registered application clientId>, "client_secret": <Registered application generated secret>, "scope": "https://graph.microsoft.com/.default", "grant_type": "client_credentials"

    响应: {"token_type" : "", "expires_in" : "", "ext_expires_in" : "", "access_token" : ""}

    注意:在 b2c 租户中注册的应用程序应该需要授权才能访问 Graph API

  2. 传递令牌以访问 API 资源,例如:使用 objectId 获取用户详细信息,

    获取网址: https : //graph.microsoft.com/v1.0/users/{objectId}

    设置标题键

     "Authorization": "Bearer " ++ {access_token from above step 1.>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM