Agregar datos personalizados a los recursos mediante extensiones
Artículo
Tiempo de lectura: 36 minutos
Microsoft Graph proporciona un único punto de conexión de API para acceder a datos e información enriquecidos centrados en las personas a través de recursos como el usuario y el mensaje. También puede ampliar Microsoft Graph agregando propiedades personalizadas a instancias de recursos sin necesidad de un almacén de datos externo.
En este artículo, trataremos cómo Microsoft Graph admite la ampliación de sus recursos, las opciones disponibles para agregar propiedades personalizadas y cuándo usarlas.
Importante
No debe utilizar extensiones para almacenar información de identificación personal confidencial, como credenciales de cuenta, números de identificación gubernamentales, datos de propietarios de tarjetas de crédito, datos de cuentas bancarias, información médica o antecedentes confidenciales.
¿Por qué agregar datos personalizados a Microsoft Graph?
Como desarrollador de ISV, puede que no desee que su aplicación ocupe mucho espacio y almacenar datos específicos del usuario específico de la aplicación en Microsoft Graph extendiendo el recurso usuario.
O puede que desee conservar el almacenamiento de perfiles de usuario de la aplicación existente y agregar un identificador específico de la aplicación al recurso usuario.
Como desarrollador empresarial, las aplicaciones internas que compila pueden depender de los datos específicos de RR. HH de su organización. La integración dentro de varias aplicaciones se puede simplificar almacenando estos datos personalizados en Microsoft Graph.
Opciones de datos personalizadas en Microsoft Graph
Microsoft Graph ofrece cuatro tipos de extensiones para agregar datos personalizados.
Atributos de extensión
Extensiones de directorio (Azure AD)
Extensiones de esquema
Extensiones abiertas
Atributos de extensión
Azure AD ofrece un conjunto de 15 atributos de extensión con nombres predefinidos en los recursos de usuario y dispositivo . Estas propiedades eran inicialmente atributos personalizados proporcionados en Active Directory (AD) local y Microsoft Exchange. Sin embargo, ahora se pueden usar para más que sincronizar datos locales de AD y Microsoft Exchange con Azure AD a través de Microsoft Graph.
Experiencia del desarrollador
Puede usar los 15 atributos de extensión para almacenar valores String en instancias de recursos usuario o dispositivo, a través de las propiedades onPremisesExtensionAttributes y extensionAttributes respectivamente. Los valores se pueden asignar al crear una nueva instancia de recurso o al actualizar una instancia de recurso existente. También se pueden filtrar.
Agregar o actualizar datos en atributos de extensión
En el siguiente ejemplo se muestra cómo almacenar datos en extensionAttribute1 y eliminar los datos existentes de extensionAttribute12 mediante una operación de actualización con un método PATCH.
GraphServiceClient graphClient = new GraphServiceClient( authProvider );
var user = new User
{
OnPremisesExtensionAttributes = new OnPremisesExtensionAttributes
{
ExtensionAttribute1 = "skypeId.adeleVance",
ExtensionAttribute13 = null
}
};
await graphClient.Users["{user-id}"]
.Request()
.UpdateAsync(user);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new User();
$onPremisesExtensionAttributes = new OnPremisesExtensionAttributes();
$onPremisesExtensionAttributes->setExtensionAttribute1('skypeId.adeleVance');
$OnPremisesExtensionAttributes->setExtensionAttribute13(null);
$requestBody->setOnPremisesExtensionAttributes($onPremisesExtensionAttributes);
$requestResult = $graphServiceClient->usersById('user-id')->patch($requestBody);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestConfiguration = new UsersRequestBuilderGetRequestConfiguration();
$queryParameters = new UsersRequestBuilderGetQueryParameters();
$queryParameters->select = ["id","displayName","onPremisesExtensionAttributes"];
$requestConfiguration->queryParameters = $queryParameters;
$requestResult = $graphServiceClient->users()->get($requestConfiguration);
Las extensiones de Directory proporcionan a los desarrolladores una experiencia de extensión fuertemente tipada, reconocible y filtrable para objetos de directorio.
Las extensiones de directorio se registran primero en una aplicación mediante la operación Create extensionProperty y deben tener como destino explícitamente a objetos de directorio específicos. Una vez que un usuario o un administrador ha dado su consentimiento a la aplicación, las propiedades de la extensión se vuelven accesibles inmediatamente en el inquilino. Todas las aplicaciones autorizadas del inquilino pueden leer y escribir datos en las propiedades de extensión definidas en una instancia del objeto de directorio de destino.
Las definiciones de extensión de directorio se administran a través del recurso extensionProperty y sus métodos asociados. Los datos se administran a través de las mismas solicitudes REST que se usan para administrar la instancia de recurso.
Crear una definición de extensión de directorio
Antes de poder agregar una extensión de directorio a una instancia de recurso, debe crear primero una definición de extensión de directorio.
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new ExtensionProperty();
$requestBody->setName('jobGroupTracker');
$requestBody->setDataType('String');
$requestBody->setTargetObjects(['User', ]);
$requestResult = $graphServiceClient->applicationsById('application-id')->extensionProperties()->post($requestBody);
Se crea una propiedad de extensión de directorio denominada extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker con un nombre de extensión que sigue la siguiente convención de nomenclatura: extension_{appId-without-hyphens}_{extensionProperty-name}.
Agregar una propiedad de extensión de directorio a un objeto de destino
Después de crear la definición de extensión de directorio, podrá agregarla a una instancia de un tipo de objeto de destino. Puede almacenar datos en la propiedad de extensión de directorio al crear una nueva instancia del objeto de destino o al actualizar un objeto existente. En el ejemplo siguiente se muestra cómo almacenar datos en la propiedad de extensión de directorio al crear un nuevo objeto de usuario.
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new User();
$requestBody->setAccountEnabled(true);
$requestBody->setDisplayName('Adele Vance');
$requestBody->setMailNickname('AdeleV');
$requestBody->setUserPrincipalName('AdeleV@contoso.com');
$passwordProfile = new PasswordProfile();
$passwordProfile->setForceChangePasswordNextSignIn(false);
$passwordProfile->setPassword('xWwvJ]6NMw+bWH-d');
$requestBody->setPasswordProfile($passwordProfile);
$additionalData = [
'extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker' => 'JobGroupN',
];
$requestBody->setAdditionalData($additionalData);
$requestResult = $graphServiceClient->users()->post($requestBody);
La solicitud devuelve un código de respuesta 201 Created y un objeto user en el cuerpo de la respuesta.
Recuperar una propiedad de extensión de directorio
En el siguiente ejemplo se muestra cómo se presentan las propiedades de la extensión de directorio y los datos asociados en una instancia de recurso. La propiedad de extensión se devolverá de forma predeterminada a través del punto de conexión beta, pero solo en $select través del punto de conexión v1.0.
GET https://graph.microsoft.com/beta/users?$select=id,displayName,extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker,extension_b7d8e648520f41d3b9c0fdeb91768a0a_permanent_pensionable
GraphServiceClient graphClient = new GraphServiceClient( authProvider );
var users = await graphClient.Users
.Request()
.Select("id,displayName,extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker,extension_b7d8e648520f41d3b9c0fdeb91768a0a_permanent_pensionable")
.GetAsync();
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestConfiguration = new UsersRequestBuilderGetRequestConfiguration();
$queryParameters = new UsersRequestBuilderGetQueryParameters();
$queryParameters->select = ["id","displayName","extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker","extension_b7d8e648520f41d3b9c0fdeb91768a0a_permanent_pensionable"];
$requestConfiguration->queryParameters = $queryParameters;
$requestResult = $graphServiceClient->users()->get($requestConfiguration);
Actualizar o eliminar propiedades de extensión de directorio
Para actualizar o eliminar el valor de la propiedad de extensión de directorio de una instancia de recurso, use el método PATCH. Para eliminar la propiedad de extensión y su valor asociado de la instancia de recurso, establezca su valor en null.
La siguiente solicitud actualiza el valor de una propiedad de extensión de directorio y elimina otra propiedad de extensión.
GraphServiceClient graphClient = new GraphServiceClient( authProvider );
var user = new User
{
AdditionalData = new Dictionary<string, object>()
{
{"extension_b7d8e648520f41d3b9c0fdeb91768a0a_permanent_pensionable", "null"},
{"extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker", "E4"}
}
};
await graphClient.Users["{user-id}"]
.Request()
.UpdateAsync(user);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new User();
$additionalData = [
'extension_b7d8e648520f41d3b9c0fdeb91768a0a_permanent_pensionable' => null,
'extension_b7d8e648520f41d3b9c0fdeb91768a0a_jobGroupTracker' => 'E4',
];
$requestBody->setAdditionalData($additionalData);
$requestResult = $graphServiceClient->usersById('user-id')->patch($requestBody);
La solicitud devuelve un código de respuesta 204 No Content.
Extensiones de esquema
Las extensiones de esquema de Microsoft Graph son conceptualmente similares a las extensiones de directorio. En primer lugar, cree su definición de extensión de esquema. A continuación, úsela para ampliar las instancias de recursos admitidas con propiedades personalizadas fuertemente tipadas. Además, es posible controlar el estado de su extensión de esquema y permitir que sea reconocible por otras aplicaciones.
Al crear una definición de extensión de esquema, debe proporcionar un nombre único para su id. Existen dos opciones de nomenclaturas:
Si ya tiene un dominio de cortesía .com,.net, .gov, .edu o .org que haya comprobado con su inquilino, puede usar el nombre de dominio junto con el nombre de esquema para definir un nombre único, con este formato {domainName}_{schemaName}. Por ejemplo, si su dominio de cortesía es contoso.com, puede definir un id. de contoso_mySchema. Esta opción es muy recomendable.
Como alternativa, puede establecer el identificador en un nombre de esquema (sin un prefijo de nombre de dominio). Por ejemplo, mySchema. Microsoft Graph le asignará un Id. de cadena en función del nombre proporcionado, en este formato: ext{8-random-alphanumeric-chars}_{schema-name}. Por ejemplo, extkvbmkofy_mySchema.
El Id. será el nombre del tipo complejo que almacenará sus datos en la instancia de recursos extendidos.
Una vez que se registra una extensión de esquema, está disponible para ser utilizada por todas las aplicaciones en el mismo inquilino que la aplicación propietaria asociada (cuando está en el estado InDevelopment) o por todas las aplicaciones en cualquier inquilino (cuando está en el estado Available). Al igual que las extensiones de directorio, las aplicaciones autorizadas tienen la capacidad de leer y escribir datos en cualquier extensión definida en el objeto de destino.
A diferencia de las extensiones abiertas, se administran las definiciones de extensión de esquema y sus datos en la instancia de recurso extendida como conjuntos independientes de operaciones de API. Para administrar los datos de extensión de esquema en la instancia de recurso extendida, use la misma solicitud REST que se usa para administrar la instancia de recurso.
Use POST para almacenar datos en la propiedad de extensión de esquema al crear un nuevo usuario.
Use PATCH para almacenar datos en la propiedad de extensión de esquema o actualizar o eliminar los datos almacenados.
Para eliminar datos de una propiedad, establezca su valor en null.
Para eliminar datos de todas las propiedades, establezca su valor en null. Si todas las propiedades son null, también se elimina el objeto de extensión de esquema.
Para actualizar cualquier propiedad, debe especificar todas las propiedades del cuerpo de la solicitud. De lo contrario, Microsoft Graph actualizará las propiedades no especificadas a null.
Use GET para leer las propiedades de extensión de esquema para todos los usuarios o usuarios individuales del inquilino.
GraphServiceClient graphClient = new GraphServiceClient( authProvider );
var schemaExtension = 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"
}
}
};
await graphClient.SchemaExtensions
.Request()
.AddAsync(schemaExtension);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new SchemaExtension();
$requestBody->setId('graphLearnCourses');
$requestBody->setDescription('Graph Learn training courses extensions');
$requestBody->setTargetTypes(['user', ]);
$propertiesExtensionSchemaProperty1 = new ExtensionSchemaProperty();
$propertiesExtensionSchemaProperty1->setName('courseId');
$propertiesExtensionSchemaProperty1->setType('Integer');
$propertiesArray []= $propertiesExtensionSchemaProperty1;
$propertiesExtensionSchemaProperty2 = new ExtensionSchemaProperty();
$propertiesExtensionSchemaProperty2->setName('courseName');
$propertiesExtensionSchemaProperty2->setType('String');
$propertiesArray []= $propertiesExtensionSchemaProperty2;
$propertiesExtensionSchemaProperty3 = new ExtensionSchemaProperty();
$propertiesExtensionSchemaProperty3->setName('courseType');
$propertiesExtensionSchemaProperty3->setType('String');
$propertiesArray []= $propertiesExtensionSchemaProperty3;
$requestBody->setProperties($propertiesArray);
$requestResult = $graphServiceClient->schemaExtensions()->post($requestBody);
Agregar una extensión de esquema a una instancia de recurso
Después de crear la definición de extensión de esquema, ahora podrá agregar la propiedad de extensión a una instancia de un tipo de objeto de destino. Puede almacenar datos en la extensión de esquema al crear una nueva instancia del objeto de destino o al actualizar un objeto existente. En el siguiente ejemplo se muestra cómo almacenar datos en la propiedad de extensión de esquema al crear un nuevo objeto de usuario.
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new User();
$requestBody->setAccountEnabled(true);
$requestBody->setDisplayName('Adele Vance');
$requestBody->setMailNickname('AdeleV');
$requestBody->setUserPrincipalName('AdeleV@m365x72712789.onmicrosoft.com');
$passwordProfile = new PasswordProfile();
$passwordProfile->setForceChangePasswordNextSignIn(false);
$passwordProfile->setPassword('xWwvJ]6NMw+bWH-d');
$requestBody->setPasswordProfile($passwordProfile);
$additionalData = [
'extkmpdyld2_graphLearnCourses' => $requestBody = new Extkmpdyld2_graphLearnCourses();
$requestBody->setCourseId(100);
$ requestBody->setCourseName('Explore Microsoft Graph');
$ requestBody->setCourseType('Online');
$requestBody->setExtkmpdyld2_graphLearnCourses($extkmpdyld2_graphLearnCourses);
];
$requestBody->setAdditionalData($additionalData);
$requestResult = $graphServiceClient->users()->post($requestBody);
La solicitud devuelve un código de respuesta 201 Created y un objeto schemaExtension en el cuerpo de la respuesta
Actualizar o eliminar una propiedad de extensión de esquema
Use la operación PATCH para actualizar una propiedad de extensión de esquema o eliminar un objeto de extensión de esquema existente. Para eliminar la propiedad de extensión y su valor asociado de la instancia de recurso, establezca su valor en null.
En el siguiente ejemplo se elimina el valor de la propiedad courseId y se actualiza la propiedad courseType. Para eliminar la propiedad de extensión extkmpdyld2_graphLearnCourses en su totalidad, establezca su valor en null.
GraphServiceClient graphClient = new GraphServiceClient( authProvider );
var user = new User
{
AdditionalData = new Dictionary<string, object>()
{
{"extkmpdyld2_graphLearnCourses", "{\"courseType\":\"Instructor-led\",\"courseId\":null}"}
}
};
await graphClient.Users["{user-id}"]
.Request()
.UpdateAsync(user);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new User();
$additionalData = [
'extkmpdyld2_graphLearnCourses' => $requestBody = new Extkmpdyld2_graphLearnCourses();
$ requestBody->setCourseType('Instructor-led');
$requestBody->setCourseId(null);
$requestBody->setExtkmpdyld2_graphLearnCourses($extkmpdyld2_graphLearnCourses);
];
$requestBody->setAdditionalData($additionalData);
$requestResult = $graphServiceClient->usersById('user-id')->patch($requestBody);
GET https://graph.microsoft.com/beta/users/0668e673-908b-44ea-861d-0661297e1a3e?$select=id,displayName,extkmpdyld2_graphLearnCourses
GraphServiceClient graphClient = new GraphServiceClient( authProvider );
var user = await graphClient.Users["{user-id}"]
.Request()
.Select("id,displayName,extkmpdyld2_graphLearnCourses")
.GetAsync();
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestConfiguration = new UserRequestBuilderGetRequestConfiguration();
$queryParameters = new UserRequestBuilderGetQueryParameters();
$queryParameters->select = ["id","displayName","extkmpdyld2_graphLearnCourses"];
$requestConfiguration->queryParameters = $queryParameters;
$requestResult = $graphServiceClient->usersById('user-id')->get($requestConfiguration);
Las extensiones abiertas de Microsoft Graph son tipados abiertos que ofrecen una forma flexible de agregar datos de la aplicación sin tipado directamente a una instancia de recurso. Estas extensiones no son fuertemente tipadas, detectables ni filtrables.
Las extensiones abiertas, junto con sus datos personalizados, son accesibles a través de la propiedad de navegación extensions de la instancia del recurso. Permiten agrupar propiedades relacionadas para facilitar el acceso y la administración.
Las definiciones de extensiones abiertas se crean y administran sobre la marcha en objetos de usuario. Se consideran únicos para cada usuario y no es necesario aplicar un patrón coherente universalmente para todos los usuarios. Por ejemplo, en el mismo inquilino:
El objeto de usuario de Adele puede tener una extensión abierta denominada socialSettings que tiene tres propiedades: linkedInProfile, skypeId y xboxGamertag.
El objeto de usuario de Bruno no puede tener ninguna propiedad de extensión abierta.
El objeto de usuario de Alex puede tener una extensión abierta denominada socialSettings con cinco propiedades: theme, color, language, font y fontSize.
La propiedad extensionName es la única propiedad predefinida y modificable una extensión abierta. Al crear una extensión abierta, debe asignar a la propiedad NombreExtensión un nombre que sea único dentro del inquilino. Una forma de hacerlo es usar un método inverso del formato de nombres de dominio (DNS) que dependa de su propio dominio, por ejemplo, Com.Contoso.ContactInfo. No use el dominio de Microsoft (Com.Microsoft o Com.OnMicrosoft) en un nombre de extensión.
Crear una extensión abierta
En el siguiente ejemplo se muestra una definición de extensión abierta con tres propiedades y cómo se presentan las propiedades personalizadas y los datos asociados en una instancia de recurso.
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new Extension();
$requestBody->set@odatatype('#microsoft.graph.openTypeExtension');
$requestBody->setId('com.contoso.socialSettings');
$additionalData = [
'extensionName' => 'com.contoso.socialSettings',
'skypeId' => 'skypeId.AdeleV',
'linkedInProfile' => 'www.linkedin.com/in/testlinkedinprofile',
'xboxGamerTag' => 'AwesomeAdele',
];
$requestBody->setAdditionalData($additionalData);
$requestResult = $graphServiceClient->usersById('user-id')->extensions()->post($requestBody);
La solicitud devuelve un código de respuesta 201 Created y un objeto openTypeExtension en el cuerpo de la respuesta.
Actualizar una extensión abierta existente
Para actualizar una extensión abierta, debe especificar todas sus propiedades en el cuerpo de la solicitud. De lo contrario, las propiedades no especificadas se actualizarán a null y se eliminarán de la extensión abierta.
La siguiente solicitud especifica solo las propiedades linkedInProfile y xboxGamerTag. El valor de la propiedad xboxGamerTag se está actualizando mientras que la propiedad linkedInProfile sigue siendo la misma. Esta solicitud también elimina la propiedad skypeId no especificada.
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new Extension();
$additionalData = [
'xboxGamerTag' => 'FierceAdele',
'linkedInProfile' => 'www.linkedin.com/in/testlinkedinprofile',
];
$requestBody->setAdditionalData($additionalData);
$requestResult = $graphServiceClient->usersById('user-id')->extensionsById('extension-id')->patch($requestBody);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new Extension();
$additionalData = [
'@odata.context' => 'https://graph.microsoft.com/beta/$metadata#users(\'3fbd929d-8c56-4462-851e-0eb9a7b3a2a5\')/extensions/$entity',
'@odata.type' => '#microsoft.graph.openTypeExtension',
'xboxGamerTag' => 'FierceAdele',
'linkedInProfile' => 'www.linkedin.com/in/testlinkedinprofile',
'id' => 'com.contoso.socialSettings',
];
$requestBody->setAdditionalData($additionalData);
$requestResult = $graphServiceClient->usersById('user-id')->extensionsById('extension-id')->get($requestBody);
1 Debido a una limitación de servicio existente, los delegados no pueden crear eventos anexados por extensión abierta en calendarios de buzones compartidos. Los intentos de hacerlo producirán una ErrorAccessDenied respuesta.
2 Estos límites en las extensiones abiertas se aplican a los siguientes recursos de directorio: usuario, grupo, dispositivo y organización.
3 Cada extensión abierta se almacena en una propiedad con nombre MAPI, que es un recurso limitado en el buzón de correo de un usuario. Este límite se aplica a los siguientes recursos de Outlook: message, event y contact
Puede administrar todas las extensiones cuando haya iniciado sesión con una cuenta profesional o educativa. Además, puede administrar extensiones abiertas para los siguientes recursos al iniciar sesión con una cuenta Microsoft personal: event, post, group, message, contact y user.
Consideraciones sobre el uso de propiedades de atributo de extensión
El objeto onPremisesExtensionAttributes solo se puede actualizar para los objetos que no se sincronizan desde AD local.
Los 15 atributos de extensión ya están predefinidos en Microsoft Graph y sus nombres de propiedad no se pueden cambiar. Por lo tanto, no puede usar nombres personalizados como SkypeId para los atributos de extensión. Esto requiere que usted y la organización tengan en cuenta las propiedades del atributo de extensión que están en uso para que otras aplicaciones no sobrescriban involuntariamente los valores.
Consideraciones para usar extensiones de directorio
Si elimina accidentalmente una definición de extensión de directorio, los datos almacenados en la propiedad asociada no se pueden detectar. Para resolver esto, cree una nueva definición de extensión de directorio en la misma aplicación propietaria y con exactamente el mismo nombre que la definición eliminada.
Cuando se elimina el objeto de definición antes de que la propiedad de extensión correspondiente se actualice a null, la propiedad seguirá contando con respecto al límite de 100 para el objeto .
Cuando se elimina la definición antes de que se eliminen los datos de la propiedad de extensión asociada, no hay ninguna manera de saber la existencia de la propiedad de extensión a través de Microsoft Graph, aunque la propiedad no detectable cuente con el límite de 100.
La eliminación de una aplicación de propietario en el inquilino principal hace que las propiedades de extensión de directorio asociadas y sus datos no se puedan detectar. Restaurar una aplicación de propietario restaura las definiciones de extensión de directorio , pero no hace que las propiedades de la extensión de directorio o sus datos se puedan detectar inmediatamente. Esto se debe a que la restauración de una aplicación no restaura automáticamente la entidad de servicio asociada en el inquilino. Para que las propiedades de la extensión de directorio y sus datos sean reconocibles, cree una nueva entidad de servicio o restaure la entidad de servicio eliminada. No se realizan cambios en otros inquilinos en los que se ha dado su consentimiento a la aplicación.
Consideraciones sobre el uso de extensiones de esquema
Una extensión de esquema debe tener una aplicación de propietario. La propiedad de la extensión de esquema no se puede reasignar a otra aplicación.
La eliminación de una definición de extensión de esquema sin establecer la extensión de esquema en null hace que la propiedad y sus datos de usuario asociados no se puedan detectar.
La eliminación de una aplicación de propietario en el inquilino principal no elimina la definición de extensión de esquema asociada ni la propiedad ni los datos que almacena. La propiedad de extensión de esquema todavía se puede leer, eliminar o actualizar para los usuarios. Sin embargo, la definición de extensión de esquema no se puede actualizar.
Consideraciones sobre el uso de extensiones abiertas
La eliminación de una aplicación creadora no afecta a la extensión abierta y a los datos que almacena.
Permisos
Los mismos permisos necesarios para leer de o escribir en un recurso específico, también son necesarios para hacerlo en cualquier extensión de datos de dicho recurso. Por ejemplo, para que una aplicación pueda actualizar el perfil de cualquier usuario con datos personalizados de la aplicación, esta debe tener el permiso User.ReadWrite.all.
Limitaciones conocidas
Para ver las limitaciones conocidas al usar las extensiones, consulte la sección de extensiones del artículo de problemas conocidos.