Adicionar dados personalizados aos recursos usando extensões
Artigo
O Microsoft Graph fornece um único ponto de extremidade de API para acessar dados e insights avançados centrados em pessoas através de recursos, como usuário e mensagem. Você também pode estender o Microsoft Graph adicionando propriedades personalizadas a instâncias de recursos sem a necessidade de um armazenamento de dados externo.
Este artigo descreve como o Microsoft Graph dá suporte à extensão de seus recursos, as opções disponíveis para adicionar propriedades personalizadas e quando usá-los.
Importante
Não use extensões para armazenar informações de identificação pessoal confidenciais, como credenciais de conta, números de identificação do governo, dados do titular do cartão, dados de conta corrente, informações médicas ou informações básicas confidenciais.
Por que adicionar dados personalizados ao Microsoft Graph?
Como desenvolvedor de ISV você pode decidir manter seu aplicativo leve e armazenar dados de perfil de usuário específicos do aplicativo no Microsoft Graph estendendo o recurso usuário.
Como alternativa, você pode querer manter o repositório de perfil de usuário existente do seu aplicativo e adicionar um identificador específico do aplicativo ao recurso do usuário .
Como desenvolvedor corporativo, os aplicativos internos que você cria podem depender dos dados específicos de RH da sua organização. A integração em vários aplicativos pode ser simplificada armazenando esses dados personalizados no Microsoft Graph.
Opções de dados personalizados no Microsoft Graph
O Microsoft Graph oferece quatro tipos de extensões para adicionar dados personalizados.
Atributos de extensão
Extensões de diretório (Microsoft Entra ID)
Extensões de esquema
Extensões abertas
Atributos de extensão
Microsoft Entra ID oferece um conjunto de 15 atributos de extensão com nomes predefinidos nos recursos de usuário e dispositivo. Essas propriedades eram inicialmente atributos personalizados fornecidos no Active Directory local (AD) e no Microsoft Exchange. No entanto, agora eles podem ser usados para mais do que sincronizar dados locais do AD e do Microsoft Exchange para Microsoft Entra ID por meio do Microsoft Graph.
Experiência do desenvolvedor
Você pode usar os 15 atributos de extensão para armazenar valores string em instâncias de recurso de usuário ou dispositivo, por meio das propriedades onPremisesExtensionAttributes e extensionAttributes, respectivamente. Você pode atribuir os valores ao criar uma nova instância de recurso ou ao atualizar uma instância de recurso existente. Você também pode filtrar pelos valores.
Adicionar ou atualizar dados em atributos de extensão
O exemplo a seguir mostra como armazenar dados em extensionAttribute1 e excluir dados existentes de extensionAttribute13 por meio de uma operação de atualização com um método PATCH.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new User
{
OnPremisesExtensionAttributes = new OnPremisesExtensionAttributes
{
ExtensionAttribute1 = "skypeId.adeleVance",
ExtensionAttribute13 = null,
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Users["{user-id}"].PatchAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
User user = new User();
OnPremisesExtensionAttributes onPremisesExtensionAttributes = new OnPremisesExtensionAttributes();
onPremisesExtensionAttributes.setExtensionAttribute1("skypeId.adeleVance");
onPremisesExtensionAttributes.setExtensionAttribute13(null);
user.setOnPremisesExtensionAttributes(onPremisesExtensionAttributes);
User result = graphClient.users().byUserId("{user-id}").patch(user);
<?php
use Microsoft\Graph\GraphServiceClient;
use Microsoft\Graph\Generated\Models\User;
use Microsoft\Graph\Generated\Models\OnPremisesExtensionAttributes;
$graphServiceClient = new GraphServiceClient($tokenRequestContext, $scopes);
$requestBody = new User();
$onPremisesExtensionAttributes = new OnPremisesExtensionAttributes();
$onPremisesExtensionAttributes->setExtensionAttribute1('skypeId.adeleVance');
$onPremisesExtensionAttributes->setExtensionAttribute13(null);
$requestBody->setOnPremisesExtensionAttributes($onPremisesExtensionAttributes);
$result = $graphServiceClient->users()->byUserId('user-id')->patch($requestBody)->wait();
GET https://graph.microsoft.com/v1.0/users?$select=id,displayName,onPremisesExtensionAttributes
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Users.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Select = new string []{ "id","displayName","onPremisesExtensionAttributes" };
});
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
UserCollectionResponse result = graphClient.users().get(requestConfiguration -> {
requestConfiguration.queryParameters.select = new String []{"id", "displayName", "onPremisesExtensionAttributes"};
});
Considerações sobre o uso de propriedades de atributo de extensão
O objeto onPremisesExtensionAttributes só pode ser atualizado para objetos que não são sincronizados do AD local.
Os 15 atributos de extensão já estão predefinidos no Microsoft Graph e seus nomes de propriedades não podem ser alterados. Portanto, você não pode usar nomes personalizados como SkypeId para os atributos de extensão. Portanto, sua organização deve controlar as propriedades do atributo de extensão em uso para evitar substituir inadvertidamente seus dados.
Extensões de diretório (Microsoft Entra ID)
As extensões de diretório fornecem aos desenvolvedores uma experiência de extensão fortemente tipada, detectável e filtrada para objetos de diretório.
As extensões de diretório são registradas primeiro em um aplicativo por meio da operação Criar extensionProperty e devem ser explicitamente direcionadas a objetos de diretório específicos e com suporte. Depois que um usuário ou um administrador tiver consentido com o aplicativo no locatário, as propriedades de extensão se tornam imediatamente acessíveis no locatário. Todos os aplicativos autorizados no locatário podem ler e gravar dados em quaisquer propriedades de extensão definidas em uma instância do objeto de diretório de destino.
Para obter a lista de tipos de recursos que podem ser especificados como objetos de destino para uma extensão de diretório, consulte Comparação de tipos de extensão.
Experiência do desenvolvedor
As definições de extensão de diretório são gerenciadas por meio do recurso extensionProperty e seus métodos associados. Os dados são gerenciados por meio das solicitações de API REST que você usa para gerenciar a instância do recurso.
Definir a extensão de diretório
Antes de adicionar uma extensão de diretório a uma instância de recurso, primeiro você deve definir a extensão de diretório.
Solicitação
Na solicitação a seguir, 30a5435a-1871-485c-8c7b-65f69e287e7b está a ID do objeto do aplicativo que possui a extensão de diretório. Você pode criar extensões de diretório que armazenam uma coleção de valores.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new ExtensionProperty
{
Name = "jobGroupTracker",
DataType = "String",
TargetObjects = new List<string>
{
"User",
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Applications["{application-id}"].ExtensionProperties.PostAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
ExtensionProperty extensionProperty = new ExtensionProperty();
extensionProperty.setName("jobGroupTracker");
extensionProperty.setDataType("String");
LinkedList<String> targetObjects = new LinkedList<String>();
targetObjects.add("User");
extensionProperty.setTargetObjects(targetObjects);
ExtensionProperty result = graphClient.applications().byApplicationId("{application-id}").extensionProperties().post(extensionProperty);
Uma propriedade de extensão de diretório chamada extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker é criada com um nome de extensão que segue a seguinte convenção de nomenclatura: extension_{appId-without-hyphens}_{extensionProperty-name}.
Adicionar uma propriedade de extensão de diretório a um objeto de destino
Depois de definir a extensão de diretório, agora você pode adicioná-la a uma instância de um tipo de objeto de destino. Você pode armazenar dados na extensão de diretório ao criar uma nova instância do objeto de destino ou ao atualizar um objeto existente. O exemplo a seguir mostra como armazenar dados na extensão do diretório ao criar um novo objeto de usuário .
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new User
{
AccountEnabled = true,
DisplayName = "Adele Vance",
MailNickname = "AdeleV",
UserPrincipalName = "AdeleV@contoso.com",
PasswordProfile = new PasswordProfile
{
ForceChangePasswordNextSignIn = false,
Password = "xWwvJ]6NMw+bWH-d",
},
AdditionalData = new Dictionary<string, object>
{
{
"extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker" , "JobGroupN"
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Users.PostAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
User user = new User();
user.setAccountEnabled(true);
user.setDisplayName("Adele Vance");
user.setMailNickname("AdeleV");
user.setUserPrincipalName("AdeleV@contoso.com");
PasswordProfile passwordProfile = new PasswordProfile();
passwordProfile.setForceChangePasswordNextSignIn(false);
passwordProfile.setPassword("xWwvJ]6NMw+bWH-d");
user.setPasswordProfile(passwordProfile);
HashMap<String, Object> additionalData = new HashMap<String, Object>();
additionalData.put("extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker", "JobGroupN");
user.setAdditionalData(additionalData);
User result = graphClient.users().post(user);
A solicitação retorna um código de resposta 201 Created e um objeto user no corpo da resposta.
Recuperar uma extensão de diretório
O exemplo a seguir mostra como as extensões de diretório e os dados associados são apresentados em uma instância de recurso. A propriedade de extensão é retornada por padrão por meio do beta ponto de extremidade, mas somente por $select meio do v1.0 ponto de extremidade.
GET https://graph.microsoft.com/beta/users?$select=id,displayName,extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker,extension_b7d8e648520f41d3b9c0fdeb91768a0a_permanent_pensionable
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Users.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Select = new string []{ "id","displayName","extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker","extension_b7d8e648520f41d3b9c0fdeb91768a0a_permanent_pensionable" };
});
// THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY
mgc-beta users list --select "id,displayName,extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker,extension_b7d8e648520f41d3b9c0fdeb91768a0a_permanent_pensionable"
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
UserCollectionResponse result = graphClient.users().get(requestConfiguration -> {
requestConfiguration.queryParameters.select = new String []{"id", "displayName", "extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker", "extension_b7d8e648520f41d3b9c0fdeb91768a0a_permanent_pensionable"};
});
Para atualizar ou excluir o valor da extensão de diretório para uma instância de recurso, use o método PATCH. Para excluir a propriedade de extensão e seu valor associado, defina seu valor como null.
A solicitação a seguir atualiza o valor de uma extensão de diretório e exclui outra propriedade de extensão.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new User
{
AdditionalData = new Dictionary<string, object>
{
{
"extension_b7d8e648520f41d3b9c0fdeb91768a0a_permanent_pensionable" , null
},
{
"extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker" , "E4"
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Users["{user-id}"].PatchAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
User user = new User();
HashMap<String, Object> additionalData = new HashMap<String, Object>();
additionalData.put("extension_b7d8e648520f41d3b9c0fdeb91768a0a_permanent_pensionable", null);
additionalData.put("extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker", "E4");
user.setAdditionalData(additionalData);
User result = graphClient.users().byUserId("{user-id}").patch(user);
A solicitação retorna o código de resposta 204 No Content.
Considerações sobre o uso de extensões de diretório
Se você excluir acidentalmente uma definição de extensão de diretório, todos os dados armazenados na propriedade associada se tornarão desconhecidos. Para recuperar os dados, crie uma nova definição de extensão de diretório com o mesmo nome da definição excluída, no mesmo aplicativo proprietário.
Quando um objeto de definição é excluído antes da propriedade de extensão correspondente ser atualizada para null, a propriedade conta contra o limite de 100 para o objeto.
Quando a definição é excluída antes que os dados na propriedade de extensão associada sejam excluídos, não há como saber a existência da propriedade de extensão por meio do Microsoft Graph - mesmo que a propriedade desconhecida conte contra o limite de 100.
Excluir um aplicativo proprietário no locatário da casa torna as extensões de diretório associadas e seus dados incoveráveis. Quando você restaura um aplicativo proprietário, ele restaura as definições de extensão de diretório, mas não torna as propriedades de extensão do diretório ou seus dados imediatamente detectáveis; porque restaurar um aplicativo não restaura automaticamente a entidade de serviço associada no locatário. Para tornar as propriedades de extensão do diretório e seus dados detectáveis, crie uma nova entidade de serviço ou restaure a entidade de serviço excluída. Nenhuma alteração é feita em outros locatários nos quais o aplicativo foi consentido.
Extensões de esquema
As extensões de esquema Microsoft Graph são conceitualmente semelhantes às extensões de diretório. Primeiro, você define sua extensão de esquema. Em seguida, use-o para estender instâncias de recurso com suporte com propriedades personalizadas fortemente tipadas. Além disso, você pode controlar o status da extensão de esquema e permitir que ela seja descoberta por outros aplicativos.
Ao criar uma definição de extensão de esquema, você deve fornecer um nome exclusivo para sua id. Há duas opções de nomes:
Se você já tiver uma vaidade .com,.net, .govou .edu um .org domínio verificado com seu locatário, você poderá usar o nome de domínio junto com o nome do esquema para definir um nome exclusivo, neste formato {domainName}_{schemaName}. Por exemplo, se o seu domínio personalizado for contoso.com, você pode definir uma id de contoso_mySchema. Essa opção é altamente recomendada.
Como alternativa, você pode definir a id como um nome de esquema (sem um prefixo de nome de domínio). Por exemplo, mySchema. O Microsoft Graph atribui uma ID de cadeia de caracteres para você com base no nome fornecido, neste formato: ext{8-random-alphanumeric-chars}_{schema-name}. Por exemplo, extkvbmkofy_mySchema.
A ID é o nome do tipo complexo que armazena seus dados na instância de recurso estendida.
Depois de registrar uma extensão de esquema, ela estará disponível para ser usada por todos os aplicativos no mesmo locatário que o aplicativo proprietário associado (quando no InDevelopment estado) ou por todos os aplicativos em qualquer locatário (quando no Available estado). Assim como as extensões de diretório, os aplicativos autorizados têm a capacidade de ler e gravar dados em quaisquer extensões definidas no objeto de destino.
Você gerencia as definições de extensão de esquema e os dados na propriedade de extensão de esquema correspondente usando conjuntos separados de operações de API. Para gerenciar os dados de extensão de esquema na instância de recurso estendido, use a mesma solicitação REST que você usa para gerenciar a instância de recurso.
Use POST para armazenar dados na propriedade de extensão de esquema quando estiver criando um novo usuário.
Use PATCH para armazenar dados na propriedade de extensão de esquema ou atualizar ou excluir os dados armazenados.
Para excluir dados de uma propriedade, defina seu valor como null.
Para excluir dados de todas as propriedades, defina cada propriedade como null. Se todas as propriedades forem null, o objeto de extensão de esquema também será excluído.
Para atualizar qualquer propriedade, você deve especificar todas as propriedades no corpo da solicitação. Caso contrário, o Microsoft Graph atualizará as propriedades não especificadas para null.
Use GET para ler as propriedades de extensão de esquema para todos os usuários ou usuários individuais no locatário.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new SchemaExtension
{
Id = "graphLearnCourses",
Description = "Graph Learn training courses extensions",
TargetTypes = new List<string>
{
"user",
},
Properties = new List<ExtensionSchemaProperty>
{
new ExtensionSchemaProperty
{
Name = "courseId",
Type = "Integer",
},
new ExtensionSchemaProperty
{
Name = "courseName",
Type = "String",
},
new ExtensionSchemaProperty
{
Name = "courseType",
Type = "String",
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.SchemaExtensions.PostAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
SchemaExtension schemaExtension = new SchemaExtension();
schemaExtension.setId("graphLearnCourses");
schemaExtension.setDescription("Graph Learn training courses extensions");
LinkedList<String> targetTypes = new LinkedList<String>();
targetTypes.add("user");
schemaExtension.setTargetTypes(targetTypes);
LinkedList<ExtensionSchemaProperty> properties = new LinkedList<ExtensionSchemaProperty>();
ExtensionSchemaProperty extensionSchemaProperty = new ExtensionSchemaProperty();
extensionSchemaProperty.setName("courseId");
extensionSchemaProperty.setType("Integer");
properties.add(extensionSchemaProperty);
ExtensionSchemaProperty extensionSchemaProperty1 = new ExtensionSchemaProperty();
extensionSchemaProperty1.setName("courseName");
extensionSchemaProperty1.setType("String");
properties.add(extensionSchemaProperty1);
ExtensionSchemaProperty extensionSchemaProperty2 = new ExtensionSchemaProperty();
extensionSchemaProperty2.setName("courseType");
extensionSchemaProperty2.setType("String");
properties.add(extensionSchemaProperty2);
schemaExtension.setProperties(properties);
SchemaExtension result = graphClient.schemaExtensions().post(schemaExtension);
Adicionar uma extensão de esquema a uma instância de recurso
Depois de definir a extensão de esquema, agora você pode adicionar a propriedade de extensão a uma instância de um tipo de objeto de destino. Você pode armazenar dados na extensão de esquema ao criar uma nova instância do objeto de destino ou ao atualizar um objeto existente. O exemplo a seguir mostra como armazenar dados na propriedade de extensão de esquema ao criar um novo objeto de usuário.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Beta.Models;
var requestBody = new User
{
AccountEnabled = true,
DisplayName = "Adele Vance",
MailNickname = "AdeleV",
UserPrincipalName = "AdeleV@contoso.com",
PasswordProfile = new PasswordProfile
{
ForceChangePasswordNextSignIn = false,
Password = "xWwvJ]6NMw+bWH-d",
},
AdditionalData = new Dictionary<string, object>
{
{
"extkmpdyld2_graphLearnCourses" , new
{
CourseId = 100,
CourseName = "Explore Microsoft Graph",
CourseType = "Online",
}
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Users.PostAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
User user = new User();
user.setAccountEnabled(true);
user.setDisplayName("Adele Vance");
user.setMailNickname("AdeleV");
user.setUserPrincipalName("AdeleV@contoso.com");
PasswordProfile passwordProfile = new PasswordProfile();
passwordProfile.setForceChangePasswordNextSignIn(false);
passwordProfile.setPassword("xWwvJ]6NMw+bWH-d");
user.setPasswordProfile(passwordProfile);
HashMap<String, Object> additionalData = new HashMap<String, Object>();
extkmpdyld2GraphLearnCourses = new ();
extkmpdyld2GraphLearnCourses.setCourseId(100);
extkmpdyld2GraphLearnCourses.setCourseName("Explore Microsoft Graph");
extkmpdyld2GraphLearnCourses.setCourseType("Online");
additionalData.put("extkmpdyld2_graphLearnCourses", extkmpdyld2GraphLearnCourses);
user.setAdditionalData(additionalData);
User result = graphClient.users().post(user);
A solicitação retorna um código de resposta 201 Created e um objeto schemaExtension no corpo da resposta
Atualizar ou excluir uma propriedade de extensão de esquema
Use a operação PATCH para atualizar uma extensão de esquema ou excluir uma extensão de esquema existente. Para excluir a propriedade de extensão e seu valor associado da instância de recurso, defina seu valor como null.
O exemplo a seguir exclui o valor da propriedade ddingId e atualiza a propriedade ddingType. Para excluir a propriedade de extensão extkmpdyld2_graphLearnCourses em sua totalidade, defina seu valor como null.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Beta.Models;
var requestBody = new User
{
AdditionalData = new Dictionary<string, object>
{
{
"extkmpdyld2_graphLearnCourses" , new
{
CourseType = "Instructor-led",
CourseId = null,
}
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Users["{user-id}"].PatchAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
User user = new User();
HashMap<String, Object> additionalData = new HashMap<String, Object>();
extkmpdyld2GraphLearnCourses = new ();
extkmpdyld2GraphLearnCourses.setCourseType("Instructor-led");
extkmpdyld2GraphLearnCourses.setCourseId(null);
additionalData.put("extkmpdyld2_graphLearnCourses", extkmpdyld2GraphLearnCourses);
user.setAdditionalData(additionalData);
User result = graphClient.users().byUserId("{user-id}").patch(user);
GET https://graph.microsoft.com/beta/users/0668e673-908b-44ea-861d-0661297e1a3e?$select=id,displayName,extkmpdyld2_graphLearnCourses
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Users["{user-id}"].GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Select = new string []{ "id","displayName","extkmpdyld2_graphLearnCourses" };
});
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
User result = graphClient.users().byUserId("{user-id}").get(requestConfiguration -> {
requestConfiguration.queryParameters.select = new String []{"id", "displayName", "extkmpdyld2_graphLearnCourses"};
});
Uma extensão de esquema deve ter um aplicativo proprietário. A propriedade da extensão de esquema não pode ser reatribuída para outro aplicativo.
Excluir uma definição de extensão de esquema sem definir a extensão de esquema para null torna a propriedade e seus dados de usuário associados desconhecidos.
Excluir um aplicativo proprietário no locatário da casa não exclui a definição de extensão de esquema associada ou a propriedade e os dados que ele armazena. A propriedade de extensão de esquema ainda pode ser lida, excluída ou atualizada para usuários. No entanto, a definição de extensão de esquema não pode ser atualizada.
Extensões abertas
Extensões abertas do Microsoft Graph são tipos abertos que oferecem uma maneira flexível de adicionar dados de aplicativo não tipados diretamente a uma instância do recurso. Essas extensões não são fortemente tipdas, detectáveis ou filtradas.
Para obter a lista de tipos de recursos que dão suporte a extensões abertas do Microsoft Graph, consulte Comparação de tipos de extensão.
Experiência do desenvolvedor
As extensões abertas, juntamente com seus dados, podem ser acessadas por meio da propriedade de navegação extensions da instância do recurso. Eles permitem agrupar propriedades relacionadas para facilitar o acesso e o gerenciamento.
Você define e gerencia extensões abertas em instâncias de recurso em tempo real. Eles são considerados exclusivos para cada objeto e você não precisa aplicar um padrão universalmente consistente para todos os objetos. Por exemplo, no mesmo locatário:
O objeto de usuário para Adele pode ter uma extensão aberta chamada socialSettings que tem três propriedades: linkedInProfile, skypeId e xboxGamertag.
O objeto de usuário para Bruno não pode ter nenhuma propriedade de extensão aberta.
O objeto de usuário para Alex pode ter uma extensão aberta chamada socialSettings com cinco propriedades: tema, cor, idioma, fonte e fontSize.
Criar uma extensão aberta
O exemplo a seguir mostra uma definição de extensão aberta com três propriedades e como as propriedades personalizadas e os dados associados são apresentados em uma instância de recurso.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new OpenTypeExtension
{
OdataType = "#microsoft.graph.openTypeExtension",
ExtensionName = "com.contoso.socialSettings",
Id = "com.contoso.socialSettings",
AdditionalData = new Dictionary<string, object>
{
{
"skypeId" , "skypeId.AdeleV"
},
{
"linkedInProfile" , "www.linkedin.com/in/testlinkedinprofile"
},
{
"xboxGamerTag" , "AwesomeAdele"
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Users["{user-id}"].Extensions.PostAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
OpenTypeExtension extension = new OpenTypeExtension();
extension.setOdataType("#microsoft.graph.openTypeExtension");
extension.setExtensionName("com.contoso.socialSettings");
extension.setId("com.contoso.socialSettings");
HashMap<String, Object> additionalData = new HashMap<String, Object>();
additionalData.put("skypeId", "skypeId.AdeleV");
additionalData.put("linkedInProfile", "www.linkedin.com/in/testlinkedinprofile");
additionalData.put("xboxGamerTag", "AwesomeAdele");
extension.setAdditionalData(additionalData);
Extension result = graphClient.users().byUserId("{user-id}").extensions().post(extension);
A solicitação retorna um código de resposta 201 Created e um objeto openTypeExtension no corpo da resposta.
Atualizar uma extensão aberta existente
Para atualizar uma extensão aberta, você deve especificar todas as suas propriedades no corpo da solicitação. Caso contrário, as propriedades não especificadas são atualizadas null e excluídas da extensão aberta.
A solicitação a seguir especifica apenas as propriedades linkedInProfile e xboxGamerTag. O valor da propriedade xboxGamerTag está sendo atualizado enquanto a propriedade linkedInProfile permanece a mesma. Essa solicitação também exclui a propriedade skypeId não especificada.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new Extension
{
AdditionalData = new Dictionary<string, object>
{
{
"xboxGamerTag" , "FierceAdele"
},
{
"linkedInProfile" , "www.linkedin.com/in/testlinkedinprofile"
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Users["{user-id}"].Extensions["{extension-id}"].PatchAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
Extension extension = new Extension();
HashMap<String, Object> additionalData = new HashMap<String, Object>();
additionalData.put("xboxGamerTag", "FierceAdele");
additionalData.put("linkedInProfile", "www.linkedin.com/in/testlinkedinprofile");
extension.setAdditionalData(additionalData);
Extension result = graphClient.users().byUserId("{user-id}").extensions().byExtensionId("{extension-id}").patch(extension);
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new OpenTypeExtension
{
OdataType = "#microsoft.graph.openTypeExtension",
Id = "com.contoso.socialSettings",
AdditionalData = new Dictionary<string, object>
{
{
"@odata.context" , "https://graph.microsoft.com/beta/$metadata#users('3fbd929d-8c56-4462-851e-0eb9a7b3a2a5')/extensions/$entity"
},
{
"xboxGamerTag" , "FierceAdele"
},
{
"linkedInProfile" , "www.linkedin.com/in/testlinkedinprofile"
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Users["{user-id}"].Extensions["{extension-id}"].GetAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
OpenTypeExtension extension = new OpenTypeExtension();
extension.setOdataType("#microsoft.graph.openTypeExtension");
extension.setId("com.contoso.socialSettings");
HashMap<String, Object> additionalData = new HashMap<String, Object>();
additionalData.put("@odata.context", "https://graph.microsoft.com/beta/$metadata#users('3fbd929d-8c56-4462-851e-0eb9a7b3a2a5')/extensions/$entity");
additionalData.put("xboxGamerTag", "FierceAdele");
additionalData.put("linkedInProfile", "www.linkedin.com/in/testlinkedinprofile");
extension.setAdditionalData(additionalData);
Extension result = graphClient.users().byUserId("{user-id}").extensions().byExtensionId("{extension-id}").get(extension);
1 Devido a uma limitação de serviço existente, os representantes não podem criar eventos abertos acrescentados à extensão em calendários de caixa de correio compartilhados. As tentativas de fazer isso resultarão em uma resposta de ErrorAccessDenied.
2 Esses limites em extensões abertas se aplicam aos seguintes recursos de diretório: usuário, grupo, dispositivo e organização.
3Cada extensão aberta é armazenada em uma propriedade nomeada MAPI, que é um recurso limitado na caixa de correio de um usuário. Esse limite se aplica aos seguintes recursos do Outlook: mensagem, eventoe contato
Você pode gerenciar todas as extensões quando estiver conectado com uma conta corporativa ou de estudante. Além disso, você pode gerenciar extensões abertas para os seguintes recursos quando conectado com uma conta pessoal Microsoft: evento, postagem, grupo, mensagem, contato e usuário.
Permissões e privilégios
Os mesmos privilégios que seu aplicativo requer para ler ou gravar em uma instância de recurso também são necessários para gerenciar quaisquer dados de extensões nessa instância de recurso. Por exemplo, em um cenário delegado, um aplicativo só pode atualizar os dados de extensão de qualquer usuário se receber a permissão User.ReadWrite.All e o usuário conectado tiver suporte Microsoft Entra função de administrador.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulte https://aka.ms/ContentUserFeedback.