我正在尝试发现我的应用程序可用的扩展属性。我最初遵循这个指南来获取扩展属性:
https://azure.microsoft.com/en-us/documentation/articles/active-directory-b2c-devquickstarts-graph-dotnet/使用自定义属性
但它只返回以下JSON:
{
"odata.metadata": "https://graph.windows.net/screenmediatestb2c.onmicrosoft.com/$metadata#directoryObjects/Microsoft.DirectoryServices.ExtensionProperty",
"value": []
}
我也尝试过使用Postman对常规HTTP请求执行此操作,但结果完全相同。我可以验证和加载应用程序、用户、组等。但是它不返回任何我的自定义属性,我有2个。
我使用的端点是:
https://graph.windows.net/[tenant]/applications/[application object ID]/extensionProperties?api-version=1.6
有人知道我做错了什么吗?
我刚刚注意到这个页面底部的免责声明https://azure.microsoft.com/en-us/documentation/articles/active-directory-b2c-reference-custom-attr/。看来这可能是我们的问题。
自定义属性有一个已知的限制。它只是被创造出来的在任何策略中第一次使用它,而不是在将它添加到用户属性列表
随附的GitHub repo教程中有一个错误:https://azure.microsoft.com/en-us/documentation/articles/active-directory-b2c-devquickstarts-graph-dotnet/使用自定义属性
将Program.GetB2CExtensionApplication(…)更改为:
private static void GetB2CExtensionApplication(string[] args)
{
object formatted = JsonConvert.DeserializeObject(client.
GetApplications("$filter=startswith(displayName, 'b2c-extensions-app')").Result);
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(JsonConvert.SerializeObject(formatted, Formatting.Indented));
}
不是检查displayName是否等于'b2c-extensions-app',而是检查它是否以'b2c-extensions-app'开头。他们已经在Azure AD B2C的后续版本中更改了应用程序的名称。
当你使用返回的ID来获取扩展名时,你会看到自定义属性名带有Guid前缀,这就是为什么我们在访问它时遇到麻烦的原因:如。extension_10ecdccd92c446829a399e68ed758978_MyCustomAttribute
GET - b2c - application的正确GET URL应该是:
GET https://graph.windows.net/{Tenant}/applications?api-version=1.6&$filter=startswith(displayName,'b2c-extensions-app')
扩展属性(自定义属性)的GET URL应该是:
GET https://graph.windows.net/{Tenant}/applications/{ObjectID}/extensionProperties?api-version=1.6
可以通过LINQ获取属性:
string selectClause = "GivenName,Surname,Id,Mail"
+ ",extension_{ExtensionPropertyPrefixGUID}_myAttribute1"
+ ",extension_{ExtensionPropertyPrefixGUID}_myAttribute2";
var result = await _graphClient.Users
.Request()
.Select(selectClause)
.GetAsync();
扩展属性可以通过AdditionalData
访问foreach (User user in result.CurrentPage)
{
string attribute1Value = (string)user.AdditionalData["extension_{ExtensionPropertyPrefixGUID}_myAttribute1";
}