Compartir a través de


Compartir y asignar

En este artículo veremos el acceso de seguridad al compartir y asignar registros.

Uso compartido de registros

Al compartir se permite que los usuarios conceder a otros usuarios o equipos acceso a la información específica del cliente. Compartir registros resulta útil para compartir información con usuarios en los roles que solo tienen el nivel de acceso Básico. Por ejemplo, en una organización que proporciona al personal de ventas acceso Básico de lectura y escritura a las cuentas, un comercial puede compartir una oportunidad con otro comercial de forma que los dos pueden realizar el seguimiento del progreso de una venta importante.

Por razones de seguridad, únicamente se deben compartir los registros necesarios con el menor número de usuarios posible. Conceda solo el mínimo acceso necesario para que los usuarios puedan realizar su trabajo. Un usuario podría tener acceso al mismo registro en más de un contexto. Por ejemplo, un usuario podría compartir directamente un registro con los derechos de acceso específicos, y ese usuario también podría estar en un equipo en el que se comparte el mismo registro con diferentes derechos de acceso. En este caso, los derechos de acceso que el usuario tiene en el registro son una combinación de todos los derechos.

Al compartir un registro con otro usuario mediante el mensaje GrantAccess, debe indicar los derechos de acceso que desee conceder a otro usuario. Use el mensaje de ModifyAccess para modificar el acceso a un registro compartido. Los derechos de acceso de un registro compartido pueden ser diferentes para cada usuario con el que se comparte el registro. Sin embargo, no puede otorgar a un usuario un derecho que ese usuario no tendría para ese tipo de tabla, en función del rol asignado a dicho usuario. Por ejemplo, si un usuario no tiene privilegios de Lectura para las cuentas y usted comparte una cuenta con ese usuario, el usuario no podrá ver esa cuenta.

Ejemplo de GrantAccess

Estos ejemplos muestran el uso del mensaje GrantAccess para compartir un registro con otra entidad de seguridad.

El siguiente método estático ShareRecord muestra cómo usar Clase PrincipalAccess para especificar una referencia a una entidad de seguridad (usuario, equipo u organización) con un conjunto de AccessRights que contengan los derechos que se otorgarán a la entidad de seguridad.

/// <summary>
/// Shares a record with a principal
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="principal">The user, team, or organization to share the record with.</param>
/// <param name="access">The access rights to grant</param>
/// <param name="record">The record to share</param>
static void ShareRecord(
   IOrganizationService service,
   EntityReference principal,
   AccessRights access,
   EntityReference record)
{

   PrincipalAccess principalAccess = new()
   {
         AccessMask = access,
         Principal = principal
   };

   GrantAccessRequest request = new()
   {
         PrincipalAccess = principalAccess,
         Target = record
   };

   service.Execute(request);
}

Ejemplo de ModifyAccess

Estos ejemplos muestran el uso del mensaje ModifyAccess para cambiar el acceso otorgado a una entidad de seguridad para un registro compartido.

El siguiente método estático ModifyShare muestra cómo usar Clase PrincipalAccess para especificar una referencia a una entidad de seguridad (usuario, equipo u organización) con un conjunto de AccessRights que contengan los derechos que se modificarán para la entidad de seguridad.

/// <summary>
/// Modifies the access to a shared record.
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="principal">The user, team, or organization to modify rights to the shared.</param>
/// <param name="access">The access rights to modify</param>
/// <param name="record">The shared record</param>
static void ModifyShare(
   IOrganizationService service,
   EntityReference principal,
   AccessRights access,
   EntityReference record)
{
   PrincipalAccess principalAccess = new()
   {
         AccessMask = access,
         Principal = principal
   };

   ModifyAccessRequest request = new()
   {

         PrincipalAccess = principalAccess,
         Target = record
   };

   service.Execute(request);
}

Uso compartido y herencia

Si se crea un registro y el registro primario tiene determinadas propiedades de uso compartido, el nuevo registro hereda esas propiedades. Por ejemplo, Juan y Miguel trabajan con un cliente potencial de prioridad alta. Juan crear un nuevo cliente potencial y dos actividades, comparte el cliente potencial con Miguel y selecciona el uso compartido en cascada. Miguel realiza una llamada de teléfono y envía un correo electrónico sobre el nuevo cliente potencial. Juan comprueba que Miguel se ha puesto en contacto con la compañía dos veces, de modo que Joe no realiza otra llamada.

El uso compartido se mantiene en registros individuales. Un registro hereda las propiedades del uso compartido de su primario y mantiene sus propias propiedades de uso compartido. Por lo tanto, un registro puede tener dos conjuntos de propiedades de uso compartido, uno propio y otro que hereda del primario.

Al quitar el uso compartido de un registro primario, se quitan las propiedades del uso compartido de los objetos (registros) que se heredaron del primario. Es decir, todos los usuarios que anteriormente tenían visibilidad en este registro ya no la tienen. Los objetos secundarios todavía se podrían compartir con algunos de estos usuarios si se compartieran de forma individual, no desde el registro primario.

Asignando registros...

Un usuario con derechos de acceso para Asignar un registro puede asignar dicho registro a otro usuario. Para asignar un registro, cambie el valor de búsqueda ownerid para hacer referencia a una nueva entidad de seguridad.

Nota

El SDK tiene una Clase AssignRequest que está en desuso. Más información: Mensajes de actualización heredados.

Cuando se asigna un registro, el nuevo usuario, equipo u organización pasa a ser el propietario del registro y de sus registros relacionados. El usuario, equipo u organización original pierde la propiedad de los registros, pero automáticamente la comparte con el nuevo propietario.

En Microsoft Dataverse, el administrador del sistema puede decidir para una organización si los registros se deben compartir con los propietarios anteriores o no después de la operación de asignación. Si se selecciona Compartir registros reasignados con el propietario original (consulte Configuración del sistema > General), el anterior propietario comparte el registro con todos los derechos de acceso después de la operación de asignación. De lo contrario, el propietario anterior no comparte el registro y no puede tener acceso al registro, en función de sus privilegios. La columna ShareToPreviousOwnerOnAssign de la tabla de la organización controla esta configuración.

Nota

La tabla Appointment tiene una lógica especial cuando se asigna una cita a otro usuario. Si el propietario actual sigue siendo un participante, como el organizador o un asistente, el registro de la cita se comparte con este usuario cuando se reasigna la cita. Este comportamiento ocurre incluso si el valor Compartir registros reasignados con el propietario original está deshabilitado. Debido a que la cita puede compartirse con el propietario anterior, el usuario que asigna la reunión requiere drechos de acceso Asignar y Compartir sobre el registro.

Revocación del acceso

El propietario del registro puede usar el mensaje RevokeAccess para revocar (elimiar) el acceso de los usuarios a su registro compartido.

El siguiente método estático RevokeShare muestra cómo eliminar el acceso compartido de un usuario a un registro mediante la Clase RevokeAccessRequest.

/// <summary>
/// Revokes access to a shared record.
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="principal">The user, team, or organization to revoke rights to the shared record.</param>
/// <param name="record">The shared record</param>
static void RevokeShare(
   IOrganizationService service,
   EntityReference principal,
   EntityReference record)
{
   RevokeAccessRequest request = new()
   {
         Revokee = principal,
         Target = record
   };

   service.Execute(request);
}

Más información: Acceso compartido

Determinar por qué un usuario tiene acceso

La función verificar acceso en aplicaciones basadas en modelos proporciona información para que las personas puedan entender por qué un usuario tiene acceso a un registro. Para obtener esta información con código, utilice el mensaje RetrieveAccessOrigin. Cuando se pasa información sobre un usuario y un registro específicos, este mensaje devuelve una oración que describe por qué el usuario tiene acceso. Las siguientes son las posibles respuestas cuando la operación tiene éxito:

Access origin could not be determined because FCB is disabled.
PrincipalId is object owner (<record ID>)
PrincipalId is member of team (<team ID>) who is object owner (<record ID>)
PrincipalId is member of organization (<organization ID>) who is object owner (<record ID>)
PrincipalId has access to (<hierarchy security principal ID>) through hierarchy security. (<hierarchy security principal ID>) is object owner (<record ID>)
PrincipalId has direct poa access to object (<record ID>)
PrincipalId is member of team (<team ID>) who has poa access to object (<record ID>)
PrincipalId is member of organization (<organization ID>) who has poa access to object (<record ID>)
PrincipalId is owner of a parent entity of object (<child record ID>)
PrincipalId is member of team (<team ID>) who is owner of a parent entity of object (<child record ID>)
PrincipalId is member of organization (<organization ID>) who is owner of a parent entity of object (<child record ID>)
PrincipalId has access to (<hierarchy security principal ID>) through hierarchy security. (<hierarchy security principal ID>) is owner of a parent entity of object (<child record ID>)
PrincipalId has poa access to object's root entity (<child record ID>)
PrincipalId is member of team (<team ID>) who has poa access to object's root entity (<child record ID>)
PrincipalId is member of organization (<organization ID>) who has poa access to object's root entity (<child record ID>)
Access origin could not be found. Access does not come from POA table or object ownership.

Nota

Actualmente no hay una clase RetrieveAccessOriginRequest o RetrieveAccessOriginResponse en el SDK. Para utilizar este mensaje debe utilizar las clases OrganizationRequest y OrganizationResponse. Más información sobre usar mensajes con SDK para .NET.

/// <summary>
/// Describes why a principal (systemuser or team) has access to a record.
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance to use.</param>
/// <param name="objectId">The unique identifier of a record.</param>
/// <param name="tableLogicalName">The logical name of the table for the record in the ObjectId parameter.</param>
/// <param name="principalId">The unique identifier of the systemuser or team record.</param>
/// <returns>A sentence explaining why the principal has access to a record.</returns>
public static void OutputRetrieveAccessOrigin(IOrganizationService service,
    Guid objectId,
    string tableLogicalName,
    Guid principalId)
{
 
    var parameters = new ParameterCollection()
        {
            { "ObjectId", objectId},
            { "LogicalName", tableLogicalName},
            { "PrincipalId", principalId}
        };
 
    var request = new OrganizationRequest()
    {
        RequestName = "RetrieveAccessOrigin",
        Parameters = parameters
    };
 
    var response = service.Execute(request);
 
    Console.WriteLine(response.Results["Response"]);
}

Ejemplo de salida: PrincipalId is object owner (e41ac31a-dcdf-ed11-a7c7-000d3a993550)

Consulte también

Ejemplo: compartir registros utilizando los mensajes GrantAccess, ModifyAccess y RevokeAccess

Nota

¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)

La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).