如何在ASP.NET MVC中获取/设置自定义Azure Active Directory B2C用户属性?

时间:2018-02-13 15:00:33

标签: c# azure-active-directory microsoft-graph azure-ad-b2c

我在Azure Active Directory B2C租户中添加了一个自定义Organization字段作为用户属性,如下所示:

enter image description here

我使用Microsoft Graph .NET Client Library来管理Azure Active Directory B2C中的用户,并希望使用类似于以下代码的内容来设置用户的自定义Organization字段和用户&# 39;内置Email Addresses字段。

await graphClient.Users[user.Id].Request().UpdateAsync(new User()
{
    Email Addresses = new StringCollection("myemail@mydomain.com")
    Organization = "Microsoft"
});

两个问题:

  1. 如何设置内置字段,例如Email Addresses
  2. 如何设置自定义字段,例如Organization
  3. 此文档显示how to create a custom attribute,但未说明如何使用Graph Client访问或使用该属性。

    本文档介绍了如何create custom attributes and edit the Relying Party (RP) file

    有更简单的方法吗?然后获取/设置这些自定义用户属性的graphClient代码是什么?

4 个答案:

答案 0 :(得分:2)

Microsoft Graph API以及Microsoft Graph Client是否支持向Azure AD B2C租户注册的扩展属性,这有点令人困惑。

当我使用Azure AD Graph API查询用户对象时,将返回自定义属性(例如“CreatedTime”)。

https://graph.windows.net/{tenant}/users/{objectId}

返回:

{
    "odata.metadata": "https://graph.windows.net/{tenant}/$metadata#directoryObjects/Microsoft.DirectoryServices.User/@Element",
    "odata.type": "Microsoft.DirectoryServices.User",
    "objectType": "User",
    ...
    "extension_917ef9adff534c858b0a683b6e6ec0f3_CreatedTime": 1518602039
}

当我使用Microsoft Graph API查询同一对象时,不会返回自定义属性。

https://graph.microsoft.com/v1.0/users/{id}/extensions

返回:

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('{id}')/extensions",
    "value": []
}

除非您收到更好的答案,否则我建议您使用Azure AD Graph API,并可选择使用the Azure AD Graph Client来获取和设置Azure AD B2C用户的扩展属性。

可以在Announcing Azure AD Graph API Client Library 2.0

找到获取和设置用户扩展属性的示例

答案 1 :(得分:1)

您可以使用Micorsoft Graph API SDK进行此操作。

请参见以下示例UserService.CreateUserWithCustomAttribute() https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/master/4-WebApp-your-API/4-2-B2C

要更新自定义属性:

var updateUser = new User();
updateUser.AdditionalData = new Dictionary<string, object>();
updateUser.AdditionalData["extension_{app id}_{property name}"] = "new value";

var result = await graphClient.Users["{id}"].Request().UpdateAsync(updateUser);

上面的代码中的{app id}是默认创建的名称为b2c-extensions-app. Do not modify. Used by AADB2C for storing user data.的应用程序的ID,但是“-”已全部删除。

答案 2 :(得分:0)

除了亚伦·霍夫曼(Aaron Hoffman)关于如何设置自定义属性的答案外,我还使用以下代码段获取我的属性:

var graphClient = new GraphServiceClient(authenticationProvider)
{
    BaseUrl = "https://graph.microsoft.com/beta"
};
var user = await graphClient
    .Users["{id}"]
    .Request()
    .GetAsync();
var field = user.AdditionalData["extension_{app id}_{property name}"];

答案 3 :(得分:0)

所以第一步是在您的自定义策略中找到

X_train.loc[indexes, 'Total day minutes'] = X_train.loc[indexes, 'Total day minutes'].str.replace(',', '.')

自定义属性被命名为extension_attributename。 要通过graphql获得它,您将需要像这样的扩展名_ {该应用的客户端ID无破折号负责存储扩展名} _ {attributename} 例如extension_57ff56e740a043fda9a38d6c1544bcf4a_mycoolattribute,您可以在代码中看到: https://github.com/Azure-Samples/ms-identity-dotnetcore-b2c-account-management/blob/master/src/Helpers/B2cCustomAttributeHelper.cs#L7-L20 图调用示例:https://graph.microsoft.com/v1.0/users/3545c38b-3f6b-4a4b-8820-e7f954a86e1e?$select=extension_57ff56e740a043fda9a38d6c1544bcf4a_mycoolattribute https://graph.microsoft.com/v1.0/users/{user-objectid}?$select=extension_57ff56e740a043fda9a38d6c1544bcf4a_mycoolattribute,extension_57ff56e740a043fda9a38d6c1544bcf4a_myotherattribute,etc