Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
Las aplicaciones del canal compartido se encuentran actualmente en versión preliminar para desarrolladores públicos. Aplicaciones en canales privados próximamente!
Los canales compartidos y privados de Microsoft Teams permiten la colaboración flexible dentro de los equipos y entre organizaciones. Actualmente, las aplicaciones de bot y pestaña se admiten en canales compartidos y privados. Con esta actualización, puede experimentar varias ventajas:
Canales compartidos: permite la comunicación sin problemas con miembros internos o externos, sin cambiar el contexto del usuario. Estos canales garantizan un control de acceso granular seguro y la sincronización de pertenencia en tiempo real.
Canales privados: proporcione un espacio seguro para que los miembros del equipo seleccionados colaboren en contenido confidencial o confidencial, lo que garantiza la privacidad y las discusiones centradas en el equipo.
Descripción de los canales para la integración de aplicaciones
Los distintos canales determinan la visibilidad de la aplicación, el acceso del usuario y el comportamiento del almacenamiento de datos:
| Canales | Access | Colaboración | Ubicación de almacenamiento de archivos |
|---|---|---|---|
| Estándar | Todos los miembros del equipo de forma predeterminada | Ideal para la colaboración en todo el equipo donde los bots o pestañas deben estar disponibles para todos los usuarios | Sitio de SharePoint del equipo |
| Private | Solo para los miembros del equipo seleccionados | Adecuado para escenarios que requieren acceso restringido a bots, conectores o archivos | Sitio de SharePoint del canal privado |
| Compartido | Entre equipos y entre organizaciones | Permite la interacción con usuarios fuera del equipo host sin necesidad de unirse al equipo. | Sitio de SharePoint del canal compartido |
Funcionalidades entre canales
Este es un esquema de los diferentes canales y sus capacidades, en varios parámetros:
| Model | Funcionalidades de canal | Canal estándar | Canales compartidos y privados |
|---|---|---|---|
| Membership | Puede agregar personas al canal sin agregar al equipo host | ❌ | ✔️ (no se admite para canales privados) |
| La pertenencia al canal se puede limitar a un subconjunto del equipo host. | ❌ | ✔️ | |
| El canal se puede compartir con otros equipos para heredar miembros | ❌ | ✔️ (no se admite para canales privados) |
|
| El canal se puede compartir directamente con su equipo primario | N/D | ✔️ (no se admite para canales privados) |
|
| Los usuarios externos pueden participar en el canal | ✔️ (Usuarios de colaboración B2B) |
✔️ | |
| El canal se hospeda en un equipo host | ✔️ | ✔️ | |
| Almacenamiento | Cada canal tiene un sitio de SharePoint dedicado | ❌ (hereda el sitio del equipo) |
✔️ |
| Modelo de aplicación | La aplicación debe instalarse en el equipo host | ✔️ | ✔️ |
| Aplicación instalada para el equipo host disponible automáticamente en el canal | ✔️ | ❌ | |
| La aplicación debe agregarse a cada canal | ❌ | ✔️ |
Importante
Compruebe las funcionalidades de la aplicación, como los límites de pertenencia, la ubicación de almacenamiento y el acceso externo. No realice ningún cambio de código en función del tipo de canal.
Descripción de cómo los distintos canales determinan la funcionalidad de la aplicación
Asegúrese de que entiende que los distintos canales determinan la funcionalidad de la aplicación, la pertenencia, el almacenamiento o la privacidad; de lo contrario, puede dar lugar a una funcionalidad rota o a una exposición de datos no intencionada:
Uso de API de pertenencia específicas del canal
No suponga que la pertenencia al equipo es igual a la pertenencia al canal. Solo los miembros que se agregan al canal pueden participar en canales compartidos y privados.
Distinguir entre usuarios y roles
Los miembros del canal pueden incluir usuarios, invitados o usuarios entre inquilinos (usuarios externos de otros inquilinos). Si la aplicación necesita distinguir entre varios usuarios para administrar el acceso, la visibilidad de los datos y la disponibilidad de características, debe validar los roles de usuario y los identificadores de inquilino antes de conceder permisos.
No suponga que un solo sitio de SharePoint está vinculado a un equipo
A diferencia de los canales estándar, que comparten el sitio de SharePoint con el equipo, los canales privados y compartidos tienen sus propios sitios de SharePoint. Use siempre la dirección URL correcta para cada canal, para evitar que falten archivos o errores de acceso no autorizados.
Mantener los datos en el ámbito de los canales
Agregue o publique datos entre canales solo cuando sea necesario para evitar pérdidas accidentales. Por ejemplo, las aplicaciones de análisis no deben incluir datos de canal privado en los informes de todo el equipo a menos que los permisos estén claramente definidos.
Habilitación de aplicaciones para canales compartidos y privados
La mayoría de las aplicaciones pueden admitir canales compartidos y privados con una actualización de manifiesto simple. En función de cualquiera de los escenarios siguientes, puede decidir el enfoque:
- Aplicaciones sin dependencia de parámetros especificados
- Aplicaciones que dependen de parámetros especificados
Aplicaciones sin dependencia de parámetros especificados
Si la aplicación no lo hace:
- Uso de la pertenencia al canal o al equipo para determinar la entrega de mensajes, la asignación de tareas o los permisos
- Acceso o administración de archivos almacenados en Teams o SharePoint
- Combinar o compartir datos entre varios canales o equipos
- Personalización de la experiencia en función de los usuarios (internos, invitados o miembros externos)
A continuación, solo necesita:
- Agregar
supportsChannelFeatures:tier1al manifiesto de la aplicación - Comprobar el comportamiento esperado y probar la aplicación entre canales
No hay ninguna dependencia del acceso clásico y de administrador para supportsChannelFeatures: tier1.
Aplicaciones que dependen de parámetros especificados
Si la aplicación controla escenarios avanzados o depende de los parámetros especificados que aparecen en la sección Aplicaciones sin dependencia de los parámetros especificados , lea esta guía para conocer las actualizaciones de destino y los procedimientos recomendados. No vuelva a escribir el código.
Nota:
- Las aplicaciones de pestañas y bots en canales compartidos y privados están disponibles en Government Community Cloud (GCC), GCC High, Department of Defense (DoD) y Teams operados por entornos de 21Vianet .
- Las aplicaciones de páginas de SharePoint y SharePoint no se admiten para canales compartidos en GCC, GCC High, DoD y Teams operados por entornos de 21Vianet.
Obtener contexto para canales compartidos y privados
Al cargar la experiencia del usuario en un canal compartido o privado, use los datos recibidos de la getContext llamada para canales compartidos o privados. La getContext llamada publica dos propiedades nuevas, hostTeamGroupID y hostTenantID, que se usan para recuperar la pertenencia al canal mediante las API de Microsoft Graph. Cada canal se crea dentro de un equipo host. Para obtener más información, vea Obtener contexto en canales compartidos y Obtener contexto para la pestaña para canales privados.
Administrar la pertenencia al canal
Use la allMembers API que administra y supervisa las pertenencias a canales en canales estándar, compartidos y privados. Mejora la precisión al reflejar correctamente los miembros directos e indirectos. Para obtener más información, vea Enumerar todos los miembros.
GET /teams/{team-id}/channels/{channel-id}/allMembers
Identificación de miembros
- Miembros directos: Usuarios que se agregan directamente al canal, incluidos los usuarios de otros inquilinos (entre inquilinos).
- Miembros indirectos: Usuarios que son miembros del equipo, con los que se comparte el canal, incluidos los equipos del mismo inquilino o entre inquilinos.
Puede identificar si un miembro de un canal compartido o privado es directo o indirecto comprobando la @microsoft.graph.originalSourceMembershipUrl anotación. Esta propiedad identifica el origen del acceso de un miembro a los canales:
| Tipo de miembro | Ámbito de anotación |
|---|---|
| Miembro directo | La @microsoft.graph.originalSourceMembershipUrl propiedad muestra que el usuario se agrega directamente a los canales |
| Miembro indirecto | La @microsoft.graph.originalSourceMembershipUrl propiedad incluye una dirección URL que apunta al equipo de origen e indica la pertenencia indirecta. |
Nota:
Es posible que reciba notificaciones duplicadas cuando se agrega un miembro a un canal compartido. Este escenario puede ocurrir si el miembro ya forma parte del canal compartido directa o indirectamente. Use la allMembers API para ver todos los miembros directos e indirectos. Omita la notificación si el miembro ya existe, ya sea directa o indirectamente.
Administración de la pertenencia indirecta entre canales
Puede administrar la pertenencia indirecta en canales mediante las siguientes API de Microsoft Graph:
Use la
allMembersAPI para recuperar todos los usuarios que son miembros de un canal específico.GET /teams/{team-id}/channels/{channel-id}/allMembersUse la
doesUserHaveAccessAPI para determinar si el usuario se quita del canal y puede ver todos los accesos de usuario y los permisos pertinentes. Las aplicaciones con permisos de aplicación clásicos y permisos de RSC pueden usar esta API.GET /teams/{team-id}/channels/{channel-id}/doesUserHaveAccess(userId='@userid',tenantId='@TenantID',userPrincipalName='@UserPrincipalName')Use la
sharedWithTeamsAPI para enumerar todos los equipos con los que se comparte un canal.GET /teams/{team-id}/channels/{channel-id}/sharedWithTeamsUse la
allowedMembersAPI para recuperar usuarios de un equipo compartido que puedan acceder a un canal compartido.GET /teams/{team-id}/channels/{channel-id}/sharedWithTeams/{sharewithteamsId}/allowedMembersNota:
La
allowedMembersAPI solo devuelve usuarios recién asociados y no se aplica a eventos no compartidos.
Obtención de notificaciones de aplicaciones para los cambios de pertenencia a grafos
Las aplicaciones instaladas en canales compartidos y privados reciben notificaciones cuando los usuarios se agregan o quitan de un equipo que comparte el canal.
Para recibir notificaciones de aplicaciones, debe:
- Instale la aplicación en un equipo host y habilitela para el canal compartido o privado. Para obtener más información sobre cómo instalar la aplicación, consulte Instalación de la aplicación.
- Cree una suscripción válida de notificación de cambios de Microsoft Graph para supervisar los cambios de pertenencia al equipo asociados y los eventos compartidos o no compartidos mediante las API admitidas.
Para recibir notificaciones de actualización de miembros directas e indirectas, debe incluir ambos parámetros de cadena de consulta al crear una suscripción. Si no se proporcionan las cadenas de consulta, la suscripción solo entrega notificaciones para las actualizaciones directas de miembros. Para obtener más información, consulte Acceso a la pertenencia al canal.
/teams/{team-id}/channels/getAllMembers?notifyOnIndirectMembershipUpdate=true&suppressNotificationWhenSharedUnsharedWithTeam=true
Esta suscripción permite a las aplicaciones supervisar los cambios de pertenencia en los canales y sus equipos asociados. Para obtener más información sobre cómo crear una suscripción de notificación de cambios de Microsoft Graph, consulte Creación de una suscripción.
Obtención de notificaciones de aplicaciones para los cambios de pertenencia a bots
El conversationUpdate evento se envía al bot cuando recibe notificaciones sobre las actualizaciones de pertenencia de los equipos donde se agrega. Para recibir notificaciones de actualización de miembros directas e indirectas, configure el bot con los siguientes requisitos previos:
Actualice el manifiesto de la aplicación. Agregar
supportsChannelFeatures:tier1para declarar la preparación de la aplicación.Solicitar permiso de consentimiento Resource-Specific (RSC)
La aplicación debe solicitar el siguiente permiso de RSC para acceder a la información de pertenencia al canal:
{ "authorization": { "permissions": { "resourceSpecific": [ { "name": "ChannelMember.Read.Group", "type": "Application" } ] } } }Asegúrese de que el bot se agrega en el canal compartido.
Para recibir notificaciones de eventos de miembro, instale el bot en el nivel de equipo y permitirlo manualmente en el canal compartido.
Este proceso garantiza que el bot está activo y autorizado para recibir notificaciones para los miembros directos e indirectos.
Administrar eventos agregados y quitados de miembros
Se envía un evento agregado de miembro al bot en los siguientes escenarios:
- Cuando el bot, en sí mismo, se instala y se agrega a una conversación
- Cuando se agrega un usuario a una conversación en la que está instalado el bot
Se envía un evento quitado de miembro al bot en los siguientes escenarios:
- Cuando el bot, en sí mismo, se desinstala y se quita de una conversación.
- Cuando se quita un usuario de una conversación en la que está instalado el bot.
Para obtener más información, consulte Eventos de conversación.
Si el bot está instalado en el equipo o canal, el SDK de Agentes recibe una conversationUpdate actividad a través del OnConversationUpdateActivityAsync método , cuando se agrega un canal compartido a otro equipo.
Cuando se agrega un nuevo miembro a un canal compartido, se llama al OnMembersAddedAsync método . Este método proporciona el contexto y los detalles del usuario que se agregó, lo que permite que el bot responda en consecuencia.
Los siguientes ejemplos del SDK de Agentes se aplican a eventos de adición y eliminación de miembros directos e indirectos.
Evento agregado de miembro
public async Task OnMembersAddedAsync(ITurnContext turnContext, AppState turnState, CancellationToken cancellationToken)
{
var membersAdded = turnContext.Activity.MembersAdded;
List<string> addedMembers = new List<string>();
foreach (var member in membersAdded)
{
if (member.Id != turnContext.Activity.Recipient.Id)
{
addedMembers.Add($"Member {member.Name} (ID {member.Id}) added.");
}
}
await ActivityUtils.SendAdaptiveCard(
"Member Added",
addedMembers,
new List<object> { "membersAdded", membersAdded },
turnContext,
cancellationToken).ConfigureAwait(false);
Evento quitado de miembro
public async Task OnMembersRemovedAsync(ITurnContext turnContext, AppState turnState, CancellationToken cancellationToken)
{
var membersRemoved = turnContext.Activity.MembersRemoved;
List<string> removedMembers = new List<string>();
foreach (var member in membersRemoved)
{
if (member.Id != turnContext.Activity.Recipient.Id)
{
removedMembers.Add($"Member {member.Name} (ID {member.Id}) removed.");
}
}
await ActivityUtils.SendAdaptiveCard(
"Member Removed",
removedMembers,
new List<object> { "membersRemoved", membersRemoved },
turnContext,
cancellationToken).ConfigureAwait(false);
}
Controlar los cambios de pertenencia masiva para el grafo
Si hay cambios en la pertenencia masiva, Teams frena las notificaciones de actualización de pertenencia individual cuando un canal se comparte o no se comparte con un equipo. Para reducir la sobrecarga de notificaciones durante las actualizaciones de pertenencia, como cuando se agrega o quita un canal compartido de un equipo con miles de miembros, use elsharedWithTeams recurso de suscripción:
/teams/{team-id}/channels/{channel-id}/sharedWithTeams
La sharedWithTeams suscripción envía una única notificación cuando un canal se comparte o no se comparte con un equipo. Evita miles de notificaciones por usuario y mejora el rendimiento de las aplicaciones que supervisan los cambios de pertenencia. Asegúrese de actualizar la lista de miembros del canal compartido mediante la API allMembers después de recibir una notificación de equipo compartida con o no compartida .
Validación del acceso de usuario para las actualizaciones de pertenencia a grafos
Cuando una aplicación recibe una notificación quitada de un miembro para una actualización de pertenencia indirecta, es importante comprobar si el usuario se quita del canal, especialmente porque el mismo usuario podría tener pertenencia directa e indirecta. Por ejemplo, si un usuario se quita de un equipo que comparte un canal, la aplicación debe confirmar si se revoca el acceso del usuario al canal compartido. Use la doesUserHaveAccess API para determinar si el usuario se quita del canal compartido. Consulte doesUserHaveAccess API para obtener más información sobre los accesos de usuario y los permisos pertinentes.
GET /teams/{team-id}/channels/{channel-id}/doesUserHaveAccess(userId='@userid',tenantId='@TenantID',userPrincipalName='@UserPrincipalName')
Cuando una aplicación recibe una notificación agregada de miembro para una actualización de pertenencia indirecta, vea la API allMembers para actualizar la lista de todos los miembros.
GET /teams/{team-id}/channels/{channel-id}/allMembers
Clasificación de miembros como inquilinos o fuera de inquilino
Puede clasificar miembros como inquilinos o fuera del inquilino comparando el valor "TenantId" del miembro o equipo con ownerTenantId el siguiente:
Obtenga el "TenantId" del miembro que desea comparar.
GET /teams/{host-team-group-id}/channels/{channel-id}/allMembersLlame a
microsoftTeams.app.getContext()en la pestaña desde la biblioteca cliente de JavaScript de Teams. La llamada a getContext() devuelve el contexto del canal compartido, que contiene los detalles comodisplayName,membershipType,ownerGroupIdyownerTenantId.Compare el
TenantIddel miembro con laownerTenantIdpropiedad y determine si el miembro es un inquilino dentro o fuera del inquilino.
Descripción de los permisos de aplicación en canales compartidos
Puede colaborar con miembros externos fuera de la organización mediante canales compartidos. Los permisos de aplicación en canales compartidos siguen la lista de aplicaciones del equipo host y la directiva de aplicación del inquilino del host.
Nota:
La API de notificación de fuente de actividad no admite notificaciones entre inquilinos para las aplicaciones de un canal compartido.
Comprobación de la instalación del bot en un canal
Cuando se agrega un canal compartido a otro equipo, el SDK de Agentes recibe una conversationUpdate actividad a través del OnConversationUpdateActivityAsync método , solo si el bot está instalado en el equipo. No hay ninguna API dedicada para comprobar si la aplicación forma parte de un canal. Los bots pueden detectar cuándo se agrega la aplicación a un canal indirectamente.
Use este channelMemberAdded evento para desencadenar lógica específica de la aplicación, como:
- Envío de un mensaje de bienvenida
- Captura de la lista de canales
- Configuración de pestañas
- Inicio de trabajos programados
protected override async Task OnConversationUpdateActivityAsync(
ITurnContext<IConversationUpdateActivity> turnContext,
CancellationToken cancellationToken)
{
var tcd = turnContext.Activity.GetChannelData<TeamsChannelData>();
var eventType = tcd?.EventType?.ToLowerInvariant();
var extended = turnContext.Activity.GetChannelData<SharedChannelChannelData>();
var raw = turnContext.Activity.ChannelData as JObject
?? (turnContext.Activity.ChannelData != null
? JObject.FromObject(turnContext.Activity.ChannelData)
: new JObject());
_logger.LogInformation("ConversationUpdate eventType={EventType}, channelId={ChannelId}, teamId={TeamId}",
eventType, tcd?.Channel?.Id, tcd?.Team?.Id);
switch (eventType)
{
case "channelshared":
{
var hostTeam = extended?.Team;
var sharedWith = extended?.SharedWithTeams ?? new List<TeamInfoEx>();
_logger.LogInformation("ChannelShared: hostTeam={HostTeamId}, sharedWithCount={Count}",
hostTeam?.Id, sharedWith.Count);
foreach (var team in sharedWith)
{
_logger.LogInformation("SharedWithTeam: id={Id}, name={Name}, aadGroupId={AadGroupId}, tenantId={TenantId}",
team.Id, team.Name, team.AadGroupId, team.TenantId);
}
await turnContext.SendActivityAsync(
MessageFactory.Text($" Channel shared with {sharedWith.Count} team(s)."),
cancellationToken);
break;
}
case "channelunshared":
{
var unsharedFrom = extended?.UnsharedFromTeams ?? new List<TeamInfoEx>();
_logger.LogInformation("ChannelUnshared: unsharedFromCount={Count}", unsharedFrom.Count);
foreach (var team in unsharedFrom)
{
_logger.LogInformation("UnsharedFromTeam: id={Id}, name={Name}, aadGroupId={AadGroupId}, tenantId={TenantId}",
team.Id, team.Name, team.AadGroupId, team.TenantId);
}
await turnContext.SendActivityAsync(
MessageFactory.Text($" Channel unshared from {unsharedFrom.Count} team(s)."),
cancellationToken);
break;
}
default:
break;
}
await base.OnConversationUpdateActivityAsync(turnContext, cancellationToken);
}
Autenticación de usuarios externos para acceder al contenido de la aplicación en SharePoint
Debe completar este paso cuando la aplicación almacena contenido en el sitio de SharePoint del inquilino que hospeda el canal y solicita un token de SharePoint.
- Guarde el identificador de inquilino de host del canal compartido donde está configurada la pestaña.
- Recupere el identificador de inquilino de host mediante
channel.ownerTenantIden JSv2 o desde lagetContextllamada en JSv1.
Ahora, envíe el host tenantId guardado dentro tenantId del parámetro de getAuthToken llamada para permitir que los usuarios entre inquilinos accedan al contenido hospedado dentro del sitio de SharePoint conectado al canal compartido.
Identificación de usuarios invitados en canales mediante Graph API
Puede identificar si un miembro de un canal es un usuario invitado, invitado a su inquilino desde una organización externa, mediante roles la propiedad recibida para cada objeto en Lista de miembros de una respuesta de canal .
Para invitados, 'roles' = 'invitado'
Para recuperar con precisión todos los usuarios invitados de un canal, use la siguiente allMembers API:
GET /teams/{team-id}/channels/{channel-id}/allMembers
Esta API funciona en todos los canales estándar y otros canales y se recomienda para identificar de forma confiable a los miembros invitados.
Acceso a datos de SharePoint en canales compartidos y privados
Si va a compilar una aplicación con SharePoint Framework, debe usar el sitio de SharePoint Online (SPO) vinculado al canal compartido, no el vinculado al grupo de equipos host. Tanto los canales compartidos como los privados tienen su propio sitio de SPO que solo es accesible para los miembros de ese canal compartido o privado específico.
Use la API de invitación de Microsoft Graph para acceder a la biblioteca de documentos del sitio SPO vinculado a un canal compartido o privado.
Nota:
Consulte Solicitud de características y ayuda general para conocer los requisitos en escenarios de buzón o calendario.
Acceso al almacenamiento de SharePoint para archivos de canal mediante Graph API
Para acceder a la raíz de archivos de SharePoint de un canal, use la siguiente API:
GET /teams/{teamId}/channels/{channelId}/filesFolder
Esta API devuelve un objeto DriveItem para la raíz de archivos de ese canal. Para obtener más información, consulte archivos de canal.
Use las propiedades siguientes para todas las operaciones de archivo posteriores:
-
parentReference.driveId: id. de unidad de SharePoint para el sitio del canal. -
itemId: el folderId de la raíz del canal.
El comportamiento esperado de la unidad de los canales es el siguiente:
- Standard canales usan el driveId del sitio de equipo.
- Otros canales usan un separado
driveIdpara sus sitios individuales.
Nota:
Almacene y reutilice siempre y driveIditemId devuelto por la API.
No codifique de forma rígida los nombres de biblioteca ni las direcciones URL en función de suposiciones sobre el sitio del equipo, ya que la ubicación del sitio del equipo puede cambiar.
Use esta GET /teams/{teamId}/channels/{channelId}/filesFolder API para todos los tipos de canal.
Administrar el acceso a archivos para usuarios externos o invitados mediante Graph API
Los usuarios externos permanecen en su inquilino mientras acceden al sitio de sharepoint del canal host. Para habilitar el acceso:
- Configure el acceso entre inquilinos en ambos lados.
- Asegúrese de que la aplicación es multiinquilino y recibe consentimiento en el inquilino del host.
Autenticación de usuarios externos en pestañas o módulos de tareas
Cuando el módulo de tabulación o tarea necesite acceder a los recursos de SharePoint en el inquilino principal del canal, realice los pasos siguientes:
Detectar usuarios externos Use getContext() para recuperar el contexto del canal. Compare
user.tenant.idconchannel.ownerTenantId or channel.hostTenantId. Si difieren, el usuario es externo.Solicitar token del inquilino principal Llame a getAuthToken() con el identificador de inquilino del usuario externo (
user.tenant.idotid) para asegurarse de que el token se emite desde su inquilino principal.
Prueba de la aplicación entre canales
Antes de publicar actualizaciones, asegúrese de que la aplicación funciona correctamente en todos los tipos de canal en situaciones reales.
Canal estándar
Confirme que la funcionalidad existente permanece intacta después de los cambios. Asegúrese de que las pestañas, los bots y las extensiones de mensajería sigan funcionando según lo esperado.
Canal compartido
Canal privado
Cree un canal privado en el equipo A con al menos dos miembros (propietario y miembro).
Realice los pasos siguientes para validar:
- Agregue la aplicación al equipo A y agréguela al canal privado.
- Compruebe que la pestaña se carga correctamente en el canal privado.
- Pruebe las respuestas del bot para diferentes tipos de usuario:
- Miembro en el inquilino
- Usuario invitado o usuario externo
- Si la aplicación muestra miembros o asigna tareas, confirme que solo usa miembros del canal y no el equipo completo.
- Agregue un nuevo miembro al canal privado y compruebe lo siguiente:
- Si la aplicación recibe un evento de cambio de pertenencia
- Si la API de pertenencia refleja el nuevo miembro
Las pruebas en estos escenarios le ayudan a detectar cualquier problema con la funcionalidad, los permisos y la experiencia del usuario.
Nota:
El canal privado aún no está disponible en la versión preliminar para desarrolladores y estará disponible pronto.
Procedimientos recomendados para admitir todos los canales
Qué hacer
- Recupere siempre la lista de miembros y los roles del canal actual antes de realizar acciones. Por ejemplo, al enviar notificaciones o asignar tareas, se dirige solo a los miembros reales del canal y no a todo el equipo.
- Controle el acceso y el uso compartido de datos en función de la pertenencia y los permisos del canal. Para obtener más información, consulte Administración de la pertenencia a canales.
- Determine si los usuarios son internos, invitados o externos (entre inquilinos) y autentíquelos en su inquilino principal. Valide siempre los permisos para escenarios entre inquilinos, especialmente al acceder a archivos. Para obtener más información, consulte Identificación de usuarios invitados en canales mediante Graph API.
- Actualice el texto de ayuda y las guías de usuario para explicar cómo se comporta la aplicación en diferentes tipos de canal, incluidas las limitaciones para invitados o usuarios externos.
- Revise la documentación y los registros de cambios de Microsoft Teams para mantenerse alineados con las actualizaciones más recientes de las API, los permisos y las configuraciones de canal.
Qué no hacer
- Restrinja las acciones confidenciales a los propietarios o usuarios internos y ofrezca características limitadas a invitados o participantes externos.
- Nunca incluya datos de canal privado en informes más amplios o canales públicos a menos que se autorice explícitamente.
Preguntas frecuentes
¿Por qué la aplicación no está visible al intentar agregarla a un canal?
Es posible que la aplicación no aparezca si falta compatibilidad necesaria en el manifiesto, como supportsChannelFeatures: tier1. Además, es posible que el instalador no tenga permisos suficientes, solo los miembros del equipo o los propietarios pueden agregar aplicaciones y las directivas locales deben permitir la instalación de la aplicación. Si el canal es un canal compartido entrante (compartido en un equipo), las aplicaciones no se pueden agregar directamente desde esa ubicación. En tales casos, cambie al equipo host para agregar la aplicación al canal. Puede detectar si un canal se comparte comprobando los metadatos del canal para el identificador del equipo host.
¿Por qué recibo un error 403 que indica que la aplicación no está habilitada en este canal al llamar a las API de canal?
Este error se produce si la aplicación está instalada en el nivel de equipo, pero no se agrega al canal. Para resolver este problema, confirme que la aplicación se agrega al canal. Si la aplicación usa el consentimiento específico de recursos (RSC), compruebe que los permisos declarados en el manifiesto coinciden con las llamadas API que se realizan, por ejemplo, ChannelMember.Read.Group para leer la pertenencia al canal. Después de agregar la aplicación, vuelva a intentar la operación. En el caso de los bots, inicie la lógica específica del canal cuando el bot reciba el channelMemberAdded evento para comprobar que se ha agregado correctamente al canal.
¿Por qué la lista de canales aparece incompleta, mostrando solo los propietarios o los usuarios que faltan?
La lista de canales parece incompleta porque se usa la API de miembros del equipo en lugar de la API específica del canal correcta. Para resolver este problema, use la /channels/{id}/allMembers API para recuperar la lista completa del canal. Si la respuesta sigue mostrando solo a los propietarios, es probable que la aplicación no se agregue al canal. Pida al usuario que agregue la aplicación al canal y vuelva a intentar la solicitud para capturar la lista actualizada.
¿Por qué se produce un error en el acceso a archivos para algunos usuarios aunque formen parte del canal?
Este error puede producirse si la aplicación usa el sitio principal de SharePoint del equipo en lugar del sitio específico del canal. Las directivas de uso compartido de la organización pueden bloquear el tipo de vínculo o que los usuarios externos no dispongan de los permisos necesarios. Para resolver este problema, asegúrese de que la aplicación usa la propiedad filesFolder del canal para obtener el driveId y itemId correctos para las operaciones de archivo. Cuando comparta archivos, use personas con vínculos de acceso existentes o la API de invitación para dar acceso a usuarios o grupos específicos.
¿Por qué los usuarios externos experimentan problemas de autenticación en pestañas o módulos de tareas?
Los problemas de autenticación suelen producirse cuando la aplicación solicita un token para el inquilino del host en lugar del inquilino principal del usuario. Para resolver este problema, compruebe si el usuario es externo comparando context.user.tenant.id con el identificador de inquilino del host o propietario. Si son diferentes, el usuario es externo y la aplicación debe solicitar el token para el inquilino principal del usuario. Para realizar este paso, pase el identificador de inquilino (tid) correcto al llamar a getAuthToken.
Cómo saber que mi aplicación se agregó a un canal?
Este problema puede producirse si la aplicación espera una lista centralizada de aplicaciones instaladas en el nivel de canal o se basa en el comportamiento de instalación de nivel de equipo. Actualmente, no hay ninguna lista de aplicaciones instalada en el nivel de canal disponible. En su lugar, los bots deben escuchar el channelMemberAdded evento dentro del canal para detectar cuándo se agregan. Cuando la aplicación obtiene un error 403 y se pierde el evento, pide al usuario que agregue el bot al canal y administre el error.
¿Por qué mi aplicación no puede crear notificaciones de cambio de mensaje en canales compartidos o privados?
Las notificaciones de cambio de mensaje pueden producir un error en canales compartidos o privados porque las suscripciones a /channels/{id}/messages se bloquean al usar el consentimiento específico de recursos (RSC) en estos tipos de canales. Si la aplicación recibe un error 403 al intentar crear una suscripción, se espera este comportamiento. Para resolver este problema, use las lecturas de mensajes a petición después de que la aplicación se haya agregado correctamente al canal.
¿Por qué se siguen produciendo errores en los vínculos de archivos para los usuarios externos incluso después de agregar la aplicación al canal?
El error de notificación de cambio de mensaje se produce cuando la directiva de uso compartido del inquilino bloquea el tipo de vínculo o cuando el usuario no tiene acceso al elemento, incluso si es miembro del canal. Otra causa común es que la aplicación podría generar vínculos que apunten a la unidad de equipo en lugar de a la unidad dedicada del canal. Para resolver este problema, vuelva a emitir los vínculos mediante la opción "personas con acceso existente" o use la API de invitación para conceder acceso a usuarios específicos. Además, asegúrese de que los vínculos hacen referencia a la unidad de canal, que se puede identificar mediante la propiedad filesFolder, en lugar del sitio de equipo.
Ejemplos de código
| Ejemplo de nombre | Descripción | .NET | Node.js | Python |
|---|---|---|---|---|
| Eventos de canal compartido de bot | Esta aplicación de ejemplo muestra el miembro transitivo del bot de Microsoft Teams que agrega y quita eventos en canales compartidos. | View | ND | ND |
| Notificación de cambio de pertenencia | La aplicación de ejemplo muestra cómo enviar notificaciones para eventos de canal compartido en Microsoft Teams. Entre los escenarios se incluyen los usuarios que se agregan, quitan o pertenencia se actualizan y cuando el canal se comparte o no se comparte con un equipo. | View | View | Ver |
Consulte también
- Administrar la pertenencia al canal
- Descripción de los permisos de aplicación en canales compartidos
- Pestañas de compilación para Teams
- Canales compartidos en Microsoft Teams
- Tipo de recurso de canal
- Directiva de retención para ubicaciones de Teams
- Usar el acceso de invitados y el acceso externo para colaborar con personas fuera de su organización
- Administrar reuniones externas y chatear con personas y organizaciones mediante identidades de Microsoft