Direct Line 增强身份验证
适用于: SDK v4
本文介绍了用户(例如)使用网络聊天控件连接到机器人时的潜在安全风险。 此外,它还演示了使用 Direct Line 增强身份验证设置和安全用户 ID 处理方式的缓解解决方案。
有两个用户标识:
模拟
冒充是指攻击者的行为,攻击者使机器人认为他们是其他人。 例如,在网上聊天中,攻击者可能会通过更改网上聊天实例的用户 ID 来模拟其他某人。
模拟缓解操作
使用不可猜出的用户 ID。
启用 Direct Line 通道的增强身份验证选项,以允许 Azure AI 机器人服务进一步检测并拒绝任何用户 ID 更改。 这意味着,从 Direct Line 发送到机器人的消息中的用户 ID (
Activity.From.Id
) 将始终与用于初始化网上聊天控件的用户 ID 相同。注意
Direct Line 根据 Direct Line 机密创建一个令牌,并将
User.Id
嵌入令牌中。 它确保发送到机器人的消息具有User.Id
作为活动的From.Id
。 如果客户端向 Direct Line 发送的消息具有不同的From.Id
,则在将消息转发给机器人之前,它将被更改为嵌入在令牌中的 ID。 因此,在用另一个用户 ID 初始化通道机密后,不能使用该 ID。此功能要求用户 ID 以
dl_
开头,如下所示。提示
有关区域机器人的更多信息,请参阅 Azure AI 机器人服务中的区域化。
public class HomeController : Controller { private const string secret = "<TODO: DirectLine secret>"; private const string dlUrl = "https://directline.botframework.azure.cn/v3/directline/tokens/generate"; public async Task<ActionResult> Index() { HttpClient client = new HttpClient(); var userId = $"dl_{Guid.NewGuid()}"; HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, dlUrl); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secret); request.Content = new StringContent( JsonConvert.SerializeObject( new { User = new { Id = userId } }), Encoding.UTF8, "application/json"); var response = await client.SendAsync(request); string token = String.Empty; if (response.IsSuccessStatusCode) { var body = await response.Content.ReadAsStringAsync(); token = JsonConvert.DeserializeObject<DirectLineToken>(body).token; } var config = new ChatConfig() { Token = token, UserId = userId }; return View(config); } }
然后,基于 Direct Line 机密生成的令牌在 Web 聊天控件中使用,如下所示:
@model Bot_Auth_DL_Secure_Site_MVC.Models.ChatConfig @{ ViewData["Title"] = "Home Page"; } <div id="webchat" role="main" /> <head> <script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script> </head> <body> <script> window.WebChat.renderWebChat({ directLine: window.WebChat.createDirectLine({ token: '@Model.Token' }), userID: '@Model.UserId' }, document.getElementById('webchat')); </script> </body>
身份欺骗
身份欺骗是指攻击者假定合法用户的身份,然后使用该身份实现恶意目标的行为。
当机器人要求通道用户 A 登录到标识提供者时,登录过程必须确保用户 A 是唯一登录到提供者的人。 如果另一个用户也被允许登录提供者,他们将有权通过机器人访问用户 A 资源。
用户身份欺骗缓解
在 Web 聊天控件中,有两种机制可以确保正确的用户登录。
魔码。 在登录过程结束时,用户会看到一个随机生成的 6 位数代码(魔码)。 用户必须在聊天中键入此代码才能完成登录过程。 这往往会导致糟糕的用户体验。 此外,容易受到网络钓鱼攻击;恶意用户可以欺骗另一个用户登录并获得密码。
Direct Line 增强身份验证。 使用 Direct Line 增强身份验证可以保证登录过程只能在与 Web 聊天客户端相同的浏览器会话中完成。
若要启用此保护,请使用包含可以托管机器人的 Web 聊天客户端的受信任域列表的 Direct Line 令牌启动 Web 聊天。 使用增强身份验证选项,可以在 Direct Line 配置页面中静态指定受信任的域(受信任的来源)列表。 请参阅配置增强身份验证部分。