为匿名用户生成应用

匿名用户没有Microsoft Entra标识,并且不会与租户联合。 匿名参与者是外部用户,但他们的身份不会显示在会议中。 匿名用户可以是演示者或与会者,但不能是组织者。 可以在应用中构建机器人、消息传递扩展、卡片和对话, (TeamsJS v1.x) 中称为任务模块,以便与匿名会议参与者互动。

注意

  • 适用于 Windows 和 Mac 的新 Teams 桌面和移动客户端支持匿名用户的应用。
  • 仅 Microsoft Edge 和 Chrome 支持匿名用户的会议应用。

对于在 Teams 会议中与应用交互的匿名用户,请确保:

  1. 更新 应用清单
  2. 在 Teams 管理中心启用 匿名用户应用交互

匿名用户的应用清单更新

注意

supportsAnonymousGuestUsers应用清单架构 v1.16 中的 属性仅在新的 Teams 客户端中受支持。

若要允许匿名用户与选项卡应用交互,请将应用清单架构 v1.16 或更高版本中的 属性更新 supportsAnonymousGuestUserstrue 。 下面是清单的示例:

"meetingExtensionDefinition": {
    "supportsAnonymousGuestUsers": true
}

有关详细信息,请参阅 应用清单架构。

匿名用户身份验证流

匿名用户无法通过Microsoft Entra身份验证或通过getAuthToken客户端 SDK 进行身份验证,因为他们不是Microsoft Entra帐户。 getAuthToken 通过返回错误 useGetAuthToken: Failed with error - User is not authenticated,匿名用户失败。 如果需要对匿名用户进行身份验证,你的应用必须识别匿名用户,并在会议中提供替代身份验证体验。 可以通过验证用户的 上下文来确定用户是否匿名。

匿名用户应用交互的管理员设置

Teams 管理员可以使用 Teams 管理中心为整个租户启用或禁用匿名用户应用交互。 如果应用需要由匿名用户访问,请确保租户管理员启用匿名用户应用交互。 默认启用此设置。 有关详细信息,请参阅 允许匿名用户在会议中与应用交互

若要测试匿名用户的应用体验,请选择会议邀请中的 URL,然后从专用浏览器窗口加入会议。

从 Teams 客户端库 In-Meeting getContext

当应用从共享应用阶段调用 API 时,getContext应用会收到匿名用户的以下信息。 可以通过检查 userLicenseTypeAnonymous来识别匿名用户。

import * as microsoftTeams from "@microsoft/teams-js";

microsoftTeams.app.getContext().then((context) => {
    if (context.user.licenseType === "Anonymous") {
        // Add your custom logic here
    }
});
属性名称 说明
userObjectId 匿名用户的空字符串。
userLicenseType Anonymous 表示匿名用户。
loginHint 匿名用户的空字符串。
userPrincipalName 匿名用户的空字符串。

有关 的详细信息 getContext,请参阅 使用 Microsoft Teams JavaScript 库获取上下文。

机器人活动和 API

有一些差异,发送到机器人的活动及其从机器人 API 接收的响应在匿名和非匿名会议参与者之间是一致的。

获取成员并获取单个成员 API

获取成员获取单个成员 API 返回匿名用户的有限信息:

{ 
  "id": "<GUID1>", 
  "name": "<AnonTest (Guest)>",  
  "tenantId": "<GUID2>", 
  "userRole": "anonymous" 
}
属性名称 说明
id 匿名用户的唯一生成值。
name 加入会议时匿名用户提供的名称。
tenantId 会议组织者的租户 ID。
userRole anonymous,表示匿名用户。

ConversationUpdate 活动 MembersAdded 和 MembersRemoved

MembersAdded

protected override async Task OnTeamsMembersAddedAsync(IList<TeamsChannelAccount> membersAdded, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
  {
     foreach (var teamMember in membersAdded)
     {
         // If UserRole == "anonymous", it indicates an anonymous user
         if (teamMember.UserRole == "anonymous" )
          {
             // Add your custom logic here
          }
          else
          {
           // Add your custom logic here
          }
     }
  }

MembersRemoved

protected override async Task OnTeamsMembersRemovedAsync(IList<TeamsChannelAccount> membersRemoved, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
   foreach (var member in membersRemoved)
   {
      // If AadObjectId is null, it indicates an anonymous user
       if (member.AadObjectId == null)
       {
           // Add your custom logic here
       }
       else
       {
           // Add your custom logic here
       }
   }

注意

当匿名用户加入或离开会议时, from 有效负载中的对象始终具有会议组织者的 ID,即使该操作是由其他人执行的。

创建对话 API

不允许机器人与匿名用户发起一对一对话。 如果机器人使用匿名用户的用户 ID 调用 创建对话 API ,则会收到“ 400 错误请求”状态代码和以下错误响应:

var conversationParameters = new ConversationParameters
    {
       IsGroup = false,
       Bot = turnContext.Activity.Recipient,
       Members = new ChannelAccount[] { teamMember },
       TenantId = turnContext.Activity.Conversation.TenantId,
    };
    
    await ((CloudAdapter)turnContext.Adapter).CreateConversationAsync(
    conversationParameters,
    async (t1, c1) =>
    {
       conversationReference = t1.Activity.GetConversationReference();
       await ((CloudAdapter)turnContext.Adapter).ContinueConversationAsync(
       _appId,
       conversationReference,
       async (t2, c2) =>
       {
         await t2.SendActivityAsync(proactiveMessage, c2);
        },
        cancellationToken);
    },
cancellationToken);
{ 
  "error": {
    "code": "BadArgument",
    "message": "Bot cannot create a conversation with an anonymous user"
  }
} 

自适应卡

匿名用户可以在会议聊天中查看自适应卡片并与之交互。 自适应卡片操作对匿名和非匿名用户的行为方式相同。 有关详细信息,请参阅 卡片操作

已知问题和限制

  • 直播活动、虚拟桌面基础结构 (VDI) 和 Linux 平台不支持匿名用户的应用。

  • Firefox 和 Safari 浏览器不支持匿名用户的应用。

  • Teams 频道会议不支持匿名用户的应用。

  • 目前, getContext API 不会为匿名用户返回用户 ID,尽管机器人 API 这样做,并且无法在这两个 API 之间关联匿名用户。

  • 匿名用户在机器人消息和卡片上看到通用应用图标,而不是应用的实际图标。

    屏幕截图显示匿名用户的应用图标显示方式。

代码示例

示例名称 Description .NET Node.js
匿名用户支持 用于在会议应用中显示匿名用户支持的示例应用。 View View

后续步骤

另请参阅