为匿名用户生成应用
匿名用户没有Microsoft Entra 标识,并且不与租户联合。 匿名参与者是外部用户,但他们的身份不会显示在会议中。 匿名用户可以是演示者或与会者,但不能是组织者。 可以在应用中构建机器人、消息传递扩展、卡片和对话, (TeamsJS v1.x) 中称为任务模块,以便与匿名会议参与者互动。
注意
- 适用于 Windows 和 Mac 的新 Teams 桌面和移动客户端支持匿名用户的应用。
- 仅 Microsoft Edge 和 Chrome 中支持匿名用户的会议应用。
对于在 Teams 会议中与应用交互的匿名用户,请确保:
匿名用户的应用清单更新
注意
supportsAnonymousGuestUsers
应用清单架构 v1.16 中的 属性仅在新的 Teams 客户端中受支持。
若要允许匿名用户与选项卡应用交互,请将应用清单架构 v1.16 或更高版本中的 属性更新 supportsAnonymousGuestUsers
为 true
。 下面是清单的示例:
"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
应用会收到匿名用户的以下信息。 可以通过检查 userLicenseType
值 Anonymous
来识别匿名用户。
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
{
"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 |