Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Freigegebene und private Kanäle in Microsoft Teams ermöglichen eine flexible Zusammenarbeit innerhalb von Teams und zwischen Organisationen. Derzeit werden Agent- und Registerkarten-Apps in freigegebenen und privaten Kanälen unterstützt. Die Verwendung dieses Updates bietet mehrere Vorteile:
Freigegebene Kanäle: Ermöglichen Sie eine nahtlose Kommunikation mit internen oder externen Mitgliedern, ohne den Kontext des Benutzers zu ändern. Diese Kanäle gewährleisten eine sichere, granulare Zugriffskontrolle und Synchronisierung der Mitgliedschaft in Echtzeit.
Private Kanäle: Bieten Sie ausgewählten Teammitgliedern einen sicheren Raum, um an vertraulichen oder vertraulichen Inhalten zusammenzuarbeiten, um Privatsphäre und fokussierte Diskussionen innerhalb des Teams zu gewährleisten.
Hinweis
Registerkarten-Apps in freigegebenen Kanälen sind in Government Community Cloud (GCC), GCC High, Department of Defense (DoD) und Teams, die von 21Vianet-Umgebungen betrieben werden, verfügbar. SharePoint und die SharePoint-Seiten-Apps werden für freigegebene Kanäle in GCC-, GCC High-, DoD- und Teams-Umgebungen, die von 21Vianet-Umgebungen betrieben werden, nicht unterstützt.
Grundlegendes zu Kanälen für die App-Integration
Verschiedene Kanäle bestimmen die App-Sichtbarkeit, den Benutzerzugriff und das Datenspeicherverhalten:
| Kanäle | Access | Zusammenarbeit | Speicherort für Dateien |
|---|---|---|---|
| Standard | Standardmäßig alle Teammitglieder | Ideal für die teamweite Zusammenarbeit, bei der Agents oder Registerkarten für jeden verfügbar sein müssen | SharePoint-Website des Teams |
| Privat | Nur für ausgewählte Teammitglieder | Geeignet für Szenarien, die eingeschränkten Zugriff auf Agents, Connectors oder Dateien erfordern | SharePoint-Website des privaten Kanals |
| Shared | Team- und organization-übergreifend | Ermöglicht die Interaktion mit Benutzern außerhalb des Hostteams, ohne dass diese dem Team beitreten müssen | SharePoint-Website des freigegebenen Kanals |
Kanalübergreifende Funktionen
Im Folgenden finden Sie eine Übersicht über die verschiedenen Kanäle und ihre Funktionen über verschiedene Parameter hinweg:
| Modell | Kanalfunktionen | Standardkanal | Freigegebene und private Kanäle |
|---|---|---|---|
| Mitgliedschaft | Kann Personen zum Kanal hinzufügen, ohne dem Hostteam hinzuzufügen | ❌ | ✔️ (Nicht unterstützt für private Kanäle) |
| Die Kanalmitgliedschaft kann auf eine Teilmenge des Hostteams beschränkt werden | ❌ | ✔️ | |
| Der Kanal kann für andere Teams freigegeben werden, um Mitglieder zu erben | ❌ | ✔️ (Nicht unterstützt für private Kanäle) |
|
| Der Kanal kann direkt mit seinem übergeordneten Team geteilt werden | Nicht zutreffend | ✔️ (Nicht unterstützt für private Kanäle) |
|
| Externe Benutzer können am Kanal teilnehmen | ✔️ (Benutzer der B2B-Zusammenarbeit) |
✔️ | |
| Der Kanal wird unter einem Hostteam gehostet | ✔️ | ✔️ | |
| Speicherplatz | Jeder Kanal verfügt über eine dedizierte SharePoint-Website | ❌ (erbt Teamwebsite) |
✔️ |
| App-Modell | App muss im Hostteam installiert sein | ✔️ | ✔️ |
| App installiert, um Teams zu hosten, automatisch im Kanal verfügbar | ✔️ | ❌ | |
| Jedem Kanal muss die App hinzugefügt werden | ❌ | ✔️ |
Wichtig
- Vermeiden Sie es, sich auf Kanaltypwerte für die App-Logik zu verlassen.
- Die Erfahrungen im Teams-Kanal entwickeln sich ständig weiter. Um sicherzustellen, dass Ihre App über die Zeit kompatibel bleibt, erstellen Sie keine Logik, die von bestimmten
membershipTypechannelTypeWerten oder Werten abhängt, die von Microsoft Graph, Agents SDK oder Teams SDK zurückgegeben werden. Verlassen Sie sich stattdessen auf die von der Plattform bereitgestellten funktionsbasierten APIs und Ereignisse, um zu bestimmen, wie sich Ihre App in einem Kanal verhalten soll.
Hinweis
- Überprüfen Sie die Funktionen Ihrer App wie Mitgliedschaftsgrenzen, Speicherort und externen Zugriff, bevor Sie die Unterstützung für freigegebene und private Kanäle aktivieren.
- Nachrichtenerweiterung – Für Apps, die ausschließlich im persönlichen Bereich ausgeführt werden, ist es nicht erforderlich, dass Updates für Benutzer in freigegebenen und privaten Kanälen verfügbar sind.
Verstehen, wie verschiedene Kanäle die App-Funktionalität bestimmen
Stellen Sie sicher, dass Sie verstehen, wie verschiedene Kanäle die App-Funktionalität, Mitgliedschaft, Speicher oder Datenschutz beeinflussen. Andernfalls kann es zu Funktionsstörungen oder unbeabsichtigten Datenverlusten kommen:
Verwenden Sie kanalspezifische Mitgliedschafts-APIs
Gehen Sie nicht davon aus, dass die Teammitgliedschaft mit der Kanalmitgliedschaft gleichzusetzen ist. Nur Mitglieder, die Sie dem Kanal hinzufügen, können an freigegebenen und privaten Kanälen teilnehmen.
Unterscheiden zwischen Benutzern und Rollen
Kanalmitglieder können mandanteninterne Benutzer, Gäste oder mandantenübergreifende Benutzer (externe Benutzer aus anderen Mandanten) sein. Wenn Ihre App zwischen verschiedenen Benutzern unterscheiden muss, um den Zugriff, die Datensichtbarkeit und die Verfügbarkeit von Features zu verwalten, müssen Sie Benutzerrollen und Mandanten-IDs überprüfen, bevor Sie Berechtigungen erteilen.
Gehen Sie nicht von einer einzelnen SharePoint-Website aus, die an ein Team gebunden ist
Im Gegensatz zu Standardkanälen, die eine SharePoint-Website für das Team freigeben, haben private und freigegebene Kanäle ihre eigenen SharePoint-Websites. Verwenden Sie immer die richtige URL für jeden Kanal, um Fehler beim fehlenden Zugriff oder Fehler durch unbefugten Zugriff zu vermeiden.
Beibehalten des Datenbereichs auf Kanäle
Aggregieren oder crossposten Sie Daten nur bei Bedarf kanalübergreifend, um versehentliche Datenlecks zu vermeiden. Beispielsweise sollten Analyse-Apps keine Daten eines privaten Kanals in teamweite Berichte aufnehmen, es sei denn, die Berechtigungen sind klar definiert.
Aktivieren von Apps für freigegebene und private Kanäle
Die meisten Apps können freigegebene und private Kanäle mit einem einfachen Manifestupdate unterstützen. Entscheiden Sie sich basierend auf einem der folgenden Szenarien für den Ansatz:
Wichtig
In App-Manifest v1.25 und höher verwenden Sie supportsChannelFeatures anstelle von supportedChannelTypes. Wenn Ihr App-Manifest deklariert supportedChannelTypes, können Sie Ihre App nicht hochladen oder übermitteln. Weitere Informationen finden Sie unter Migrieren von supportedChannelTypes.
Apps ohne Abhängigkeit von angegebenen Parametern
Wenn Ihre App dies nicht tut:
- Verwenden Sie die Kanal- oder Teammitgliedschaft, um die Nachrichtenübermittlung, Aufgabenzuweisung oder Berechtigungen zu bestimmen.
- Zugreifen auf oder Verwalten von Dateien, die in Teams oder SharePoint gespeichert sind
- Kombinieren oder Freigeben von Daten über mehrere Kanäle oder Teams hinweg
- Anpassen der Erfahrung basierend auf Benutzern (intern, Gäste oder externe Mitglieder)
Dann müssen Sie nur noch folgende Schritte ausführen:
- Hinzufügen
supportsChannelFeatures:tier1zu Ihrem App-Manifest - Überprüfen Sie das erwartete Verhalten und testen Sie Ihre App kanalübergreifend.
Es besteht keine Abhängigkeit von klassischem und Administratorzugriff für supportsChannelFeatures: tier1.
Apps mit Abhängigkeit von angegebenen Parametern
Wenn Ihre App erweiterte Szenarien verarbeitet oder von den im Abschnitt Apps ohne Abhängigkeit von angegebenen Parametern aufgeführten Parametern abhängt, lesen Sie diesen Leitfaden mit gezielten Updates und bewährten Methoden. Schreiben Sie Ihren Code nicht um.
Migrieren von supportedChannelTypes
Frühere Versionen des App-Manifests verwendeten die optionale supportedChannelTypes Eigenschaft, um eine App in privaten und freigegebenen Kanälen zu aktivieren:
"supportedChannelTypes": [
"sharedChannels",
"privateChannels"
]
Ersetzen supportedChannelTypes durch supportsChannelFeatures , wenn Sie Ihr App-Manifest auf Version 1.25 oder höher aktualisieren. Apps, die bereits mit einer früheren App-Manifestversion veröffentlicht wurden, funktionieren weiterhin.
So migrieren Sie Ihre App:
- Aktualisieren Sie Ihr App-Manifest auf Version 1.25 oder höher.
- Entfernen Sie die
supportedChannelTypesEigenschaft aus dem App-Manifest. - Fügen Sie :
tier1zum App-Manifest hinzusupportsChannelFeatures. - Wenn Ihr Agent Informationen zur Kanalmitgliedschaft benötigt, fordern Sie die Berechtigung für die
ChannelMember.Read.Groupressourcenspezifische Zustimmung (RSC) an. Weitere Informationen finden Sie unter Abrufen von App-Benachrichtigungen zu Änderungen der Agent-Mitgliedschaft. - Testen Sie Ihre App in einem Standardkanal, einem privaten Kanal und einem freigegebenen Kanal. Weitere Informationen finden Sie unter Testen Ihrer App in verschiedenen Kanälen.
In der folgenden Tabelle wird zusammengefasst, welche Änderungen sich bei der Migration ergeben:
| Bereich |
supportedChannelTypes (App-Manifest v1.24 und früher) |
supportsChannelFeatures (App-Manifest v1.25 und höher) |
|---|---|---|
| Deklaration des App-Manifests | Werte pro Kanaltyp: sharedChannels, privateChannels |
Einzelnes Bereitschaftsflag: tier1 |
| Unterstützte App-Funktionen | Nur Registerkarten | Agents und Registerkarten |
Kontext für freigegebene und private Kanäle abrufen
Verwenden Sie beim Laden der Benutzeroberfläche in einem freigegebenen oder privaten Kanal die vom getContext Anruf empfangenen Daten für freigegebene oder private Kanäle. Der getContext Aufruf veröffentlicht zwei Eigenschaften, die das Hostteam und den Hostmandanten identifizieren, die zum Abrufen der Kanalmitgliedschaft mithilfe von Microsoft Graph-APIs verwendet werden. Jeder Kanal wird innerhalb eines Hostteams erstellt. Weitere Informationen finden Sie unter Abrufen von Kontext in freigegebenen Kanälen und Abrufen von Kontext für Ihre Registerkarte für private Kanäle.
Die Eigenschaftsnamen unterscheiden sich zwischen TeamsJS v1 und TeamsJS v2:
| Wert | TeamsJS v1 (getContext) |
TeamsJS v2 (app.getContext()) |
|---|---|---|
| Gruppen-ID des Gastgeberteams | hostTeamGroupId |
channel.ownerGroupId |
| Hostmandanten-ID | hostTenantId |
channel.ownerTenantId |
In diesem Artikel werden die TeamsJS v2-Namen verwendet. Wenn Ihre App TeamsJS v1 verwendet, lesen Sie hostTeamGroupId und hostTenantId aus demselben Kontextobjekt.
Gruppieren von IDs über Kanaltypen hinweg
Apps müssen in Installation und Nutzung mandantenübergreifend funktionieren. Die im Kanalkontext zurückgegebene Gruppen-ID hängt vom Kanaltyp ab:
| Kanaltyp | team.groupId |
channel.ownerGroupId
hostTeamGroupId(in TeamsJS v1) |
|---|---|---|
| Standard | Team Microsoft Entra Gruppen-ID | Team Microsoft Entra Gruppen-ID |
| Shared | Empty | Gastgeberteam Microsoft Entra-Gruppen-ID |
Verwenden Sie channel.ownerGroupId immer (oder hostTeamGroupId in TeamsJS v1) als beim {team-id} Aufrufen der in diesem Artikel beschriebenen Microsoft Graph-Kanal-APIs.
Kanalmitgliedschaft verwalten
Verwenden Sie die allMembers API zum Verwalten und Überwachen von Kanalmitgliedschaften in Standard-, freigegebenen und privaten Kanälen. Er verbessert die Genauigkeit, indem direkte und indirekte Member korrekt wiedergegeben werden. Weitere Informationen finden Sie unter List allMembers.
GET /teams/{team-id}/channels/{channel-id}/allMembers
Hinweis
In der vorherigen Anleitung wurde die Liste der freigegebenen Kanäle in drei Schritten erstellt: Listen Sie direkte Mitglieder auf mit GET /teams/{host-team-group-id}/channels/{channel-id}/members, Listen Sie freigegebene Teams auf GET /teams/{host-team-group-id}/channels/{channel-id}/sharedWithTeamsund listen Sie dann die Mitglieder jedes freigegebenen Teams mit GET /teams/{host-team-group-id}/channels/{channel-id}/sharedWithTeams/{team-id}/membersauf. Ein einzelner allMembers Aufruf ersetzt dieses Muster. Verwenden Sie die @microsoft.graph.originalSourceMembershipUrl Anmerkung, um direkte und indirekte Mitglieder zu unterscheiden, und verwenden Sie die doesUserHaveAccess API, um zu bestätigen, ob ein Benutzer nach dem Entfernen noch Zugriff hat.
Mitglieder identifizieren
- Direkte Mitglieder: Benutzer, die dem Kanal direkt hinzugefügt werden, einschließlich Benutzer aus anderen Mandanten (mandantenübergreifend).
- Indirekte Mitglieder: Benutzer, die Mitglieder des Teams sind, für das der Kanal freigegeben ist, einschließlich Teams im selben Mandanten oder in einem mandantenübergreifenden Team.
Sie können erkennen, ob ein Mitglied eines freigegebenen oder privaten Kanals direkt oder indirekt ist, indem Sie die @microsoft.graph.originalSourceMembershipUrl Anmerkung überprüfen. Diese Eigenschaft identifiziert die Quelle des Zugriffs eines Mitglieds auf die Kanäle:
| Mitgliedstyp | Anmerkungsbereich |
|---|---|
| Direktes Mitglied | Die @microsoft.graph.originalSourceMembershipUrl Eigenschaft zeigt, dass der Benutzer direkt zu den Kanälen hinzugefügt wird |
| Indirektes Mitglied | Die @microsoft.graph.originalSourceMembershipUrl Eigenschaft enthält eine URL, die auf das Quellteam verweist und eine indirekte Mitgliedschaft angibt. |
Hinweis
Möglicherweise erhalten Sie doppelte Benachrichtigungen, wenn ein Mitglied zu einem freigegebenen Kanal hinzugefügt wird. Dieses Szenario kann vorkommen, wenn das Mitglied bereits direkt oder indirekt Teil des freigegebenen Kanals ist. Verwenden Sie die allMembers API, um alle direkten und indirekten Mitglieder anzuzeigen. Ignorieren Sie die Benachrichtigung, wenn das Mitglied bereits direkt oder indirekt vorhanden ist.
Verwalten der indirekten Mitgliedschaft über mehrere Kanäle
Sie können die indirekte Mitgliedschaft in Kanälen mithilfe der folgenden Microsoft Graph-APIs verwalten:
Verwenden Sie die
allMembersAPI, um alle Benutzer abzurufen, die Mitglieder eines bestimmten Kanals sind.GET /teams/{team-id}/channels/{channel-id}/allMembersVerwenden Sie die
doesUserHaveAccessAPI, um zu überprüfen, ob der Benutzer aus dem Kanal entfernt wurde und alle Benutzerzugriffe und relevanten Berechtigungen anzeigen kann. Apps mit klassischen Anwendungsberechtigungen und RSC-Berechtigungen können diese API verwenden.GET /teams/{team-id}/channels/{channel-id}/doesUserHaveAccess(userId='@userid',tenantId='@TenantID',userPrincipalName='@UserPrincipalName')Verwenden Sie die
sharedWithTeamsAPI, um alle Teams aufzulisten, für die ein Kanal freigegeben ist.GET /teams/{team-id}/channels/{channel-id}/sharedWithTeamsVerwenden Sie die
allowedMembersAPI, um Benutzer aus einem freigegebenen Team abzurufen, die auf einen freigegebenen Kanal zugreifen können.GET /teams/{team-id}/channels/{channel-id}/sharedWithTeams/{sharewithteamsId}/allowedMembersHinweis
Die
allowedMembersAPI gibt nur neu zugeordnete Benutzer zurück und gilt nicht für nicht freigegebene Ereignisse.
Erhalten von App-Benachrichtigungen zu Änderungen der Microsoft Graph-Mitgliedschaft
Apps, die in freigegebenen und privaten Kanälen installiert sind, erhalten Benachrichtigungen, wenn Benutzer einem Team, das den Kanal freigibt, hinzugefügt oder daraus entfernt werden.
Um App-Benachrichtigungen zu erhalten, müssen Sie:
- Installieren Sie die App in einem Hostteam, und aktivieren Sie sie für den freigegebenen oder privaten Kanal. Weitere Informationen zum Installieren der App finden Sie unter Installieren der App.
- Erstellen Sie ein gültiges Abonnement für Microsoft Graph-Änderungsbenachrichtigungen, um Änderungen der zugehörigen Teammitgliedschaft sowie freigegebene oder nicht freigegebene Ereignisse mithilfe unterstützter APIs zu überwachen.
Um sowohl direkte als auch indirekte Benachrichtigungen über die Aktualisierung von Mitgliedern zu erhalten, müssen Sie beim Erstellen eines Abonnements beide Abfragezeichenfolgenparameter einschließen. Wenn Sie die Abfragezeichenfolgen nicht angeben, sendet das Abonnement nur Benachrichtigungen für direkte Mitgliederaktualisierungen. Weitere Informationen finden Sie unter Zugriff auf Kanalmitgliedschaften.
/teams/{team-id}/channels/getAllMembers?notifyOnIndirectMembershipUpdate=true&suppressNotificationWhenSharedUnsharedWithTeam=true
Mit diesem Abonnement können Apps Mitgliedschaftsänderungen in Kanälen und den zugehörigen Teams überwachen. Weitere Informationen zum Erstellen eines Abonnements für Microsoft Graph-Änderungsbenachrichtigungen finden Sie unter Erstellen eines Abonnements.
Erhalten von App-Benachrichtigungen zu Änderungen der Agent-Mitgliedschaft
Ihr Agent erhält das conversationUpdate Ereignis, wenn er Benachrichtigungen über Mitgliedschaftsaktualisierungen für Teams erhält, in denen es hinzugefügt wurde. Um sowohl direkte als auch indirekte Benachrichtigungen über Mitgliederaktualisierungen zu erhalten, richten Sie Ihren Agent mit den folgenden Voraussetzungen ein:
Aktualisieren Sie das App-Manifest auf Version 1.25. Hinzufügen
supportsChannelFeatures:tier1um die App-Bereitschaft zu erklären.Berechtigung für Resource-Specific Zustimmung anfordern (RSC)
Ihre App muss die folgende RSC-Berechtigung anfordern, um auf Informationen zur Kanalmitgliedschaft zuzugreifen:
{ "authorization": { "permissions": { "resourceSpecific": [ { "name": "ChannelMember.Read.Group", "type": "Application" } ] } } }Hinzufügen des Agents im freigegebenen Kanal
Um Benachrichtigungen über Mitgliederereignisse zu erhalten, installieren Sie den Agent auf Teams-Ebene und lassen Sie ihn manuell im freigegebenen Kanal zu.
Dieser Prozess stellt sicher, dass der Agent aktiv und autorisiert ist, Benachrichtigungen für direkte und indirekte Mitglieder zu erhalten.
Verwalten von hinzugefügten und entfernten Ereignissen für Mitglieder
In den folgenden Szenarien wird ein Ereignis für ein hinzugefügtes Mitglied an Ihren Agent gesendet:
- Wenn Sie den Agent installieren und zu einer Unterhaltung hinzufügen.
- Wenn Sie einen Benutzer zu einer Unterhaltung hinzufügen, in der der Agent installiert ist.
Ihr Agent empfängt das Ereignis, dass ein Mitglied entfernt wurde, in den folgenden Szenarien:
- Wenn Sie den Agent deinstallieren und aus einer Unterhaltung entfernen.
- Wenn Sie einen Benutzer aus einer Unterhaltung entfernen, in der der Agent installiert ist.
Weitere Informationen finden Sie unter Unterhaltungsereignisse.
Wenn Sie den Agent im Team oder Kanal installieren, empfängt das Agents-SDK eine conversationUpdate Aktivität über die OnConversationUpdateActivityAsync Methode, wenn Sie einem anderen Team einen freigegebenen Kanal hinzufügen.
Wenn Sie einem freigegebenen Kanal ein neues Mitglied hinzufügen, wird die OnMembersAddedAsync Methode aufgerufen. Diese Methode stellt den Kontext und die Details des hinzugefügten Benutzers bereit, damit der Agent entsprechend reagieren kann.
Die folgenden Beispiele für das Agents SDK gelten sowohl für direkte als auch für indirekte Ereignisse zum Hinzufügen und Entfernen von Mitgliedern.
Ereignis für Mitglied hinzugefügt
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);
Ereignis "Mitglied entfernt"
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);
}
Massenmitgliedschaftsänderungen für Graph behandeln
Wenn es Massenänderungen an der Mitgliedschaft gibt, schränkt Teams die Aktualisierungen einzelner Mitgliedschaften ein, wenn ein Kanal für ein Team freigegeben oder nicht freigegeben wird. Um die Benachrichtigungsüberflutung bei Mitgliedschaftsaktualisierungen zu reduzieren, z. B. wenn ein freigegebener Kanal zu einem Team mit Tausenden von Mitgliedern hinzugefügt oder daraus entfernt wird, verwenden Sie die sharedWithTeams Abonnementressource:
/teams/{team-id}/channels/{channel-id}/sharedWithTeams
Das sharedWithTeams Abonnement sendet eine einzelne Benachrichtigung, wenn ein Kanal für ein Team freigegeben oder nicht freigegeben wird. Es vermeidet Tausende von Benachrichtigungen pro Benutzer und verbessert die Leistung für Apps, die Mitgliedschaftsänderungen überwachen. Stellen Sie sicher, dass Sie die Mitgliederliste des freigegebenen Kanals mithilfe der allMembers-API aktualisieren, nachdem Sie eine Benachrichtigung erhalten haben, die vom Team für odernicht freigegeben wurde .
Überprüfen des Benutzerzugriffs für Graph-Mitgliedschaftsupdates
Wenn eine App eine Benachrichtigung erhält, dass ein Mitglied entfernt wurde, ist es wichtig zu überprüfen, ob der Benutzer aus dem Kanal entfernt wurde, zumal derselbe Benutzer sowohl eine direkte als auch eine indirekte Mitgliedschaft haben kann. Wenn ein Benutzer beispielsweise aus einem Team entfernt wird, das einen Kanal gemeinsam nutzt, muss Ihre App bestätigen, ob der Zugriff des Benutzers auf den freigegebenen Kanal widerrufen wurde. Verwenden Sie die doesUserHaveAccess API, um zu ermitteln, ob der Benutzer aus dem freigegebenen Kanal entfernt wird. Weitere Informationen zu Benutzerzugriffen und relevanten Berechtigungen finden Sie unter doesUserHaveAccess-API .
GET /teams/{team-id}/channels/{channel-id}/doesUserHaveAccess(userId='@userid',tenantId='@TenantID',userPrincipalName='@UserPrincipalName')
Wenn eine App eine Benachrichtigung über ein hinzugefügtes Mitglied für eine indirekte Mitgliedschaftsaktualisierung empfängt, rufen Sie die allMembers-API auf, um die Liste aller Mitglieder zu aktualisieren.
GET /teams/{team-id}/channels/{channel-id}/allMembers
Klassifizieren von Mitgliedern als mandanteninterne oder außermandfähige Mitglieder
Sie können Mitglieder als mandanteninterne oder außermandantenfähige Mitglieder klassifizieren, indem Sie die TenantId des Mitglieds oder Teams mit ownerTenantId folgendem vergleichen:
Holen Sie sich die des Mitglieds, das
TenantIdSie vergleichen möchten.GET /teams/{host-team-group-id}/channels/{channel-id}/allMembersRufen Sie Ihren Tab aus der JavaScript-Clientbibliothek von Teams auf
microsoftTeams.app.getContext(). Der Aufruf getContext() gibt den Kontext des freigegebenen Kanals zurück, der Details wiedisplayName,membershipType,ownerGroupIdundownerTenantIdenthält.Vergleichen Sie das
TenantIdMitglied mit derownerTenantIdEigenschaft, und bestimmen Sie, ob es sich bei dem Mitglied um einen In-Tenant- oder Out-Tenant handelt.
Grundlegendes zu App-Berechtigungen in freigegebenen Kanälen
Sie können mit externen Mitgliedern außerhalb Ihrer Organization zusammenarbeiten, indem Sie freigegebene Kanäle verwenden. App-Berechtigungen in freigegebenen Kanälen richten sich nach der App-Liste des Host-Teams und der App-Richtlinie des Hostmandanten.
Hinweis
Die Aktivitätsfeed-Benachrichtigungs-API unterstützt keine mandantenübergreifenden Benachrichtigungen für Apps in einem freigegebenen Kanal.
Überprüfen der Agent-Installation in einem Kanal
Wenn ein freigegebener Kanal einem anderen Team hinzugefügt wird, erhält das Agents-SDK nur dann eine conversationUpdate Aktivität über die OnConversationUpdateActivityAsync Methode, wenn der Agent im Team installiert ist. Es gibt keine dedizierte API, um zu überprüfen, ob Ihre App Teil eines Kanals ist. Agents können erkennen, wenn Ihre App indirekt zu einem Kanal hinzugefügt wird.
Verwenden Sie dieses channelMemberAdded Ereignis, um eine App-spezifische Logik auszulösen, z. B.:
- Eine Willkommensnachricht senden
- Abrufen der Kanalliste
- Konfigurieren von Registerkarten
- Starten geplanter Aufträge
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);
}
Authentifizieren externer Benutzer für den Zugriff auf App-Inhalte in SharePoint
Führen Sie diesen Schritt aus, wenn Ihre App Inhalte auf der SharePoint-Website des Mandanten speichert, der den Kanal hostet, und ein SharePoint-Token anfordert.
- Speichern Sie die Hostmandanten-ID des freigegebenen Kanals, in dem die Registerkarte konfiguriert ist.
- Rufen Sie die Hostmandanten-ID
channel.ownerTenantIdmithilfe in TeamsJS v2 oderhostTenantIdaus demgetContextAnruf in TeamsJS v1 ab.
Senden Sie jetzt den gespeicherten Host-Inside-Aufrufparameter tenantIdtenantIdgetAuthToken , um mandantenübergreifenden Benutzern den Zugriff auf Inhalte zu ermöglichen, die in der SharePoint-Website gehostet werden, die an den freigegebenen Kanal angefügt ist.
Identifizieren von Gastbenutzern in Kanälen mithilfe der Graph-API
Sie können feststellen, ob ein Kanalmitglied ein Gastbenutzer ist, der von einer externen organization zu Ihrem Mandanten eingeladen wurde, indem Sie die roles Eigenschaft für jedes Objekt in der Antwort Mitglieder eines Kanals auflisten.
Für Gäste, roles = guest.
Verwenden Sie die folgende allMembers API, um alle Gastbenutzer in einem Kanal genau abzurufen:
GET /teams/{team-id}/channels/{channel-id}/allMembers
Diese API funktioniert über Standard- und andere Kanäle hinweg und wird für die zuverlässige Identifizierung von Gastmitgliedern empfohlen.
Zugriff auf SharePoint-Daten in freigegebenen und privaten Kanälen
Wenn Sie eine App mit SharePoint-Framework erstellen, müssen Sie die SharePoint in Microsoft 365 (SPO)-Website verwenden, die mit dem freigegebenen Kanal verknüpft ist, nicht die Website, die mit der Hostteamgruppe verknüpft ist. Sowohl freigegebene als auch private Kanäle verfügen über eine eigene SharePoint-Website, auf die nur Mitglieder dieses bestimmten freigegebenen oder privaten Kanals zugreifen können.
Verwenden Sie die Microsoft Graph-Einladungs-API, um auf die Dokumentbibliothek der SharePoint in Microsoft 365-Website zuzugreifen, die mit einem freigegebenen oder privaten Kanal verknüpft ist.
Hinweis
Alle Anforderungen zu Postfach- oder Calendar-Szenarien finden Sie unter Featureanforderung und allgemeine Hilfe.
Zugriff auf SharePoint-Speicher für Kanaldateien mithilfe der Graph-API
Verwenden Sie die folgende API, um auf den SharePoint-Stamm eines Kanals zuzugreifen:
GET /teams/{teamId}/channels/{channelId}/filesFolder
Diese API gibt ein DriveItem-Objekt für den Dateistamm dieses Kanals zurück. Weitere Informationen finden Sie unter Kanaldateien.
Verwenden Sie die folgenden Eigenschaften für alle nachfolgenden Dateioperationen:
-
parentReference.driveId: Die SharePoint-Laufwerks-ID für die Website des Kanals. -
itemId: Die Ordner-ID für den Stamm des Kanals.
Das erwartete Laufwerksverhalten der Kanäle sieht wie folgt aus:
- Standardkanäle verwenden die driveId der Teamwebsite.
- Andere Kanäle verwenden ein separates
driveIdKonto für ihre einzelnen Websites.
Hinweis
Speichern und verwenden Sie die driveId und itemId werden immer von der API zurückgegeben.
Kodieren Sie Bibliotheksnamen oder URLs nicht hart, basierend auf Annahmen über die Teamwebsite, da sich der Standort der Teamwebsite ändern kann.
Verwenden Sie diese GET /teams/{teamId}/channels/{channelId}/filesFolder API für alle Kanaltypen.
Verwalten des Dateizugriffs für externe oder Gastbenutzer mithilfe der Graph-API
Externe Benutzer bleiben in ihrem Mandanten, wenn sie auf die SharePoint-Website des Hostkanals zugreifen. So aktivieren Sie den Zugriff:
- Konfigurieren Sie den mandantenübergreifenden Zugriff auf beiden Seiten.
- Stellen Sie sicher, dass Ihre App mehrinstanzenfähig ist und die Zustimmung im Hostmandanten erhält.
Authentifizieren externer Benutzer in Registerkarten oder Aufgabenmodulen
Wenn Ihre Registerkarte oder Ihr Aufgabenmodul auf SharePoint-Ressourcen im Home-Mandanten des Kanals zugreifen muss, führen Sie die folgenden Schritte aus:
Externe Benutzer erkennen Wird zum Abrufen des Kanalkontexts verwendet
getContext(). Vergleicheuser.tenant.idmitchannel.ownerTenantId(hostTenantIdin TeamsJS v1). Wenn sie sich unterscheiden, ist der Benutzer extern.Token vom Home-Mandanten anfordern Rufen Sie getAuthToken() mit der Mandanten-ID
user.tenant.id( odertid) des externen Benutzers auf, um sicherzustellen, dass das Token von seinem Home-Mandanten ausgegeben wird.
Testen Ihrer App über mehrere Kanäle hinweg
Stellen Sie vor dem Veröffentlichen von Updates sicher, dass Ihre App in realen Situationen über alle Kanaltypen hinweg ordnungsgemäß funktioniert.
Standardkanal
Vergewissern Sie sich, dass die vorhandene Funktionalität nach Ihren Änderungen erhalten bleibt. Stellen Sie sicher, dass Registerkarten, Bots und Messaging-Erweiterungen weiterhin wie erwartet funktionieren.
Freigegebener Kanal
Privater Kanal
Erstellen Sie einen privaten Kanal in Team A mit mindestens zwei Mitgliedern (Besitzer und Mitglied).
Führen Sie die folgenden Schritte aus, um die Unterstützung für private Kanäle zu überprüfen:
- Fügen Sie die App zu Team A hinzu, und fügen Sie sie dann dem privaten Kanal hinzu.
- Stellen Sie sicher, dass Ihre Registerkarte im privaten Kanal ordnungsgemäß geladen wird.
- Wenn Ihre App Mitglieder auflistet oder Aufgaben zuweist, bestätigen Sie, dass nur Kanalmitglieder und nicht das gesamte Team verwendet werden.
- Fügen Sie ein neues Mitglied zum privaten Kanal hinzu und überprüfen Sie:
- Ob Ihre App ein Mitgliedschaftsänderungsereignis empfängt
- Ob Ihre Mitgliedschafts-API das neue Mitglied widerspiegelt
Durch Tests in diesen Szenarien können Sie Probleme mit Funktionalität, Berechtigungen und Benutzerfreundlichkeit erkennen.
Bewährte Methoden zur Unterstützung aller Kanäle
Was Sie tun sollten
- Rufen Sie immer die Mitgliederliste und die Rollen des aktuellen Kanals ab , bevor Sie Aktionen ausführen. Wenn Sie z. B. Benachrichtigungen senden oder Aufgaben zuweisen, adressieren Sie nur die tatsächlichen Kanalmitglieder und nicht das gesamte Team.
- Steuern Sie den Datenzugriff und die Datenfreigabe basierend auf Kanalmitgliedschaft und Berechtigungen. Weitere Informationen finden Sie unter Verwalten der Kanalmitgliedschaft.
- Bestimmen Sie , ob Benutzer intern, Gäste oder extern (mandantenübergreifend) sind, und authentifizieren Sie sie in ihrem Home-Mandanten. Überprüfen Sie immer Berechtigungen für mandantenübergreifende Szenarien, insbesondere beim Zugriff auf Dateien. Weitere Informationen finden Sie unter Identifizieren von Gastbenutzern in Kanälen mithilfe der Graph-API.
- Aktualisieren Sie Hilfetexte und Benutzerhandbücher , um zu erklären, wie sich Ihre App in verschiedenen Kanaltypen verhält, einschließlich etwaiger Einschränkungen für Gäste oder externe Benutzer.
- Sehen Sie sich die Dokumentation und die Änderungsprotokolle von Teams an, um mit den neuesten Updates für APIs, Berechtigungen und Kanalkonfigurationen auf dem Laufenden zu bleiben.
Was Sie nicht tun sollten
- Beschränken vertraulicher Aktionen auf Besitzer oder interne Benutzer und Anbieten eingeschränkter Features für Gäste oder externe Teilnehmer.
- Verwenden Sie Daten privater Kanäle niemals in umfassenderen Berichten oder öffentlichen Kanälen, es sei denn, dies ist ausdrücklich gestattet.
Häufig gestellte Fragen
Warum ist die App nicht sichtbar, wenn ich versuche, sie einem Kanal hinzuzufügen?
Die App wird möglicherweise nicht angezeigt, wenn für das Manifest die erforderliche Unterstützung fehlt, z. B supportsChannelFeatures: tier1. . Darüber hinaus verfügt das Installationsprogramm möglicherweise nicht über ausreichende Berechtigungen. Nur Teammitglieder oder Besitzer können Apps hinzufügen, und lokale Richtlinien müssen die App-Installation zulassen. Wenn es sich bei dem Kanal um einen eingehenden freigegebenen Kanal (in einem Team freigegeben) handelt, können Sie Apps nicht direkt von diesem Speicherort aus hinzufügen. Wechseln Sie in solchen Fällen zum Hostteam, um die App zum Kanal hinzuzufügen. Sie können erkennen, ob ein Kanal freigegeben ist, indem Sie die Kanalmetadaten auf die Hostteam-ID überprüfen.
Warum erhalte ich beim Aufrufen von Kanal-APIs den 403-Fehler "App in diesem Kanal nicht aktiviert"?
Dieser Fehler tritt auf, wenn die App auf Teamebene installiert, aber nicht dem Kanal hinzugefügt wird. Um dieses Problem zu beheben, bestätigen Sie, dass die App dem Kanal hinzugefügt wurde. Wenn Ihre App die ressourcenspezifische Zustimmung (Resource-Specific Consent, RSC) verwendet, überprüfen Sie, ob die im Manifest deklarierten Berechtigungen mit den API-Aufrufen übereinstimmen, die ChannelMember.Read.Group Sie beispielsweise zum Lesen der Kanalmitgliedschaft vornehmen. Nachdem Sie die App hinzugefügt haben, wiederholen Sie den Vorgang. Für Telefonberater initiieren Sie eine kanalspezifische Logik, wenn der Agent das channelMemberAdded Ereignis empfängt, um das erfolgreiche Hinzufügen zum Kanal zu überprüfen.
Warum erscheint die Kanalliste unvollständig und enthält nur Besitzer oder fehlende Benutzer?
Die Kanalliste wird unvollständig angezeigt, da die API für Teammitglieder anstelle der richtigen kanalspezifischen API verwendet wird. Um dieses Problem zu beheben, verwenden Sie die /channels/{id}/allMembers API, um die vollständige Kanalliste abzurufen. Wenn die Antwort immer noch nur Besitzer anzeigt, wird die App wahrscheinlich nicht zum Kanal hinzugefügt. Fordern Sie den Benutzer auf, die App dem Kanal hinzuzufügen, und wiederholen Sie dann die Anforderung, um die aktualisierte Liste abzurufen.
Warum schlägt der Dateizugriff für einige Benutzer fehl, obwohl sie Teil des Kanals sind?
Dieser Fehler kann auftreten, wenn die App die SharePoint-Hauptwebsite des Teams anstelle der spezifischen Website des Kanals verwendet. Die Freigaberichtlinien Ihrer organization blockieren möglicherweise den Linktyp, oder externen Benutzern fehlen möglicherweise die erforderlichen Berechtigungen. Um dieses Problem zu beheben, stellen Sie sicher, dass Ihre App die filesFolder Eigenschaft des Kanals verwendet, um die richtigen driveIditemId und für Dateivorgänge zu erhalten. Verwenden Sie beim Freigeben von Dateien Personen mit vorhandenen Zugriffslinks oder die Einladungs-API, um bestimmten Benutzern oder Gruppen Zugriff zu gewähren.
Warum treten bei externen Benutzern Authentifizierungsprobleme in Registerkarten oder Aufgabenmodulen auf?
Authentifizierungsprobleme treten häufig auf, wenn die App ein Token für den Hostmandanten anstelle des Home-Mandanten des Benutzers anfordert. Um dieses Problem zu beheben, überprüfen Sie, ob es sich bei dem Benutzer um einen externen Benutzer handelt, indem Sie ihn mit der Host- oder Besitzermandanten-ID vergleichen context.user.tenant.id . Wenn sie unterschiedlich sind, handelt es sich um einen externen Benutzer, und Ihre App muss das Token für den Home-Mandanten des Benutzers anfordern. Sie können diesen Schritt ausführen, indem Sie beim Aufruf getAuthTokendie richtige Mandanten-ID (tid) übergeben.
Gewusst wie weiß ich, dass meine App einem Kanal hinzugefügt wurde?
Dieses Problem kann auftreten, wenn die App eine zentrale Liste der installierten Apps auf Kanalebene erwartet oder sich auf das Installationsverhalten auf Teamebene verlässt. Zurzeit ist keine Liste auf Kanalebene installedApps verfügbar. Stattdessen müssen Agents auf das channelMemberAdded Ereignis innerhalb des Kanals lauschen, um zu erkennen, wann sie hinzugefügt werden. Wenn die App einen 403-Fehler erhält und das Ereignis verpasst, fordert sie den Benutzer auf, den Agent zum Kanal hinzuzufügen, und verwaltet den Fehler.
Warum kann meine App keine Nachrichtenänderungsbenachrichtigungen in freigegebenen oder privaten Kanälen erstellen?
Benachrichtigungen über Nachrichtenänderungen können in freigegebenen oder privaten Kanälen fehlschlagen, da Abonnements /channels/{id}/messages blockiert werden, wenn in diesen Kanaltypen die ressourcenspezifische Zustimmung (Resource-Specific Consent, RSC) verwendet wird. Wenn Ihre App beim Versuch, ein Abonnement zu erstellen, einen 403-Fehler erhält, wird dieses Verhalten erwartet. Um dieses Problem zu beheben, verwenden Sie das Lesen von Nachrichten bei Bedarf, nachdem die App erfolgreich zum Kanal hinzugefügt wurde.
Warum schlagen Dateilinks für externe Benutzer auch dann fehl, wenn die App dem Kanal hinzugefügt wurde?
Der Fehler bei der Benachrichtigung über die Nachrichtenänderung tritt auf, wenn die Freigaberichtlinie des Mandanten den Linktyp blockiert oder wenn der Benutzer keinen Zugriff auf das Element hat, auch wenn er Mitglied des Kanals ist. Eine weitere häufige Ursache ist, dass die App möglicherweise Links generiert, die auf das Teamlaufwerk statt auf das dedizierte Laufwerk des Kanals verweisen. Um dieses Problem zu beheben, stellen Sie die Links erneut mithilfe der Option "Personen mit vorhandenem Zugriff" aus, oder verwenden Sie die Einladungs-API, um bestimmten Benutzern Zugriff zu gewähren. Stellen Sie außerdem sicher, dass die Links auf das Kanallaufwerk verweisen, das anhand der filesFolder Eigenschaft und nicht der Teamwebsite identifiziert werden kann.
Codebeispiele
| Beispielname | Beschreibung | .NET | Node.js | Python |
|---|---|---|---|---|
| Ereignisse des freigegebenen Agent-Kanals | In dieser Beispiel-App wird der transitive Teams-Agent, der Ereignisse zum Hinzufügen und Entfernen von Mitgliedern in freigegebenen Kanälen anzeigt. | View | – | – |
| Benachrichtigung über Mitgliedschaftsänderung | Die Beispielanwendung zeigt, wie Sie Benachrichtigungen für freigegebene Kanalereignisse in Teams senden. Zu den Szenarien gehört, dass Benutzer hinzugefügt, entfernt oder Mitgliedschaften aktualisiert werden und wenn der Kanal für ein Team freigegeben oder nicht freigegeben wird. | View | View | Anzeigen |
Siehe auch
- Kanalmitgliedschaft verwalten
- Grundlegendes zu App-Berechtigungen in freigegebenen Kanälen
- Erstellen von Registerkarten für Teams
- Referenz zum Schema von Microsoft 365-App-Manifesten
- Freigegebene Kanäle in Microsoft Teams
- Kanalressourcentyp
- Aufbewahrungsrichtlinie für Teams-Speicherorte
- Verwenden Sie den Gastzugriff und den externen Zugriff, um mit Personen außerhalb Ihres Unternehmens zusammenzuarbeiten
- Verwalten externer Besprechungen und Chatten mit Personen und Organisationen mithilfe von Microsoft-Identitäten