为新的GDPR方法获取IBotState

时间:2018-04-25 03:27:03

标签: botframework

微软今天发表了关于Bot Framework的GDPR合规性的博文 - https://blog.botframework.com/2018/04/23/general-data-protection-regulation-gdpr/

有一个实施(https://github.com/leeroy79/GDPRBot),但遇到了一些障碍。他们提供的样本依赖于已弃用的州服务,因此对备选方案感到疑惑。

第1部分 - 具体来说 - 我们如何在不使用状态客户端的情况下获得IBotStateIConversations(其中3个提到的GDPR方法可以运行),无论是在机器人内部还是在推荐的外部网站中?

第2部分 - 在给定上述方法SetUserData()SetPrivateConversationData()的情况下,如何为某个特定用户清除对话/用户/私人对话数据的任何想法都被弃用了?

我尝试了以下但实际上并没有清除状态。我可以直接执行context.UserData.Clear()context.PrivateConversationData.Clear()但是当此代码移动到独立网站并且context无法按照GDPR帖子中的建议提供时,这将无效。

using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, context.Activity.AsMessageActivity()))
{
    var dataStore = scope.Resolve<IBotDataStore<BotData>>();

    var address = new Address(
       context.Activity.Recipient.Id,
       context.Activity.ChannelId,
       context.Activity.From.Id,
       context.Activity.Conversation.Id,
       context.Activity.ServiceUrl);

    var token = default(CancellationToken);

    await dataStore.SaveAsync(address, BotStoreType.BotUserData, null, token);
    await dataStore.SaveAsync(address, BotStoreType.BotPrivateConversationData, null, token);
    await dataStore.FlushAsync(address, token);
}

干杯

1 个答案:

答案 0 :(得分:2)

  

我们如何获得IBotStateIConversations(其中3个   提到的GDPR方法在不使用State Client的情况下运行   在推荐的机器人或外部网站内?

State Client不被弃用,它是Microsoft提供的初始实现(有时称为Bot State Service)。

迁移机器人代码以使用自己的存储(请参阅here)后,例如Azure Table Storage或Cosmos DB,您应该使用IBotDataStore<BotData>界面来操作数据。

  

还有关于如何清除对话/用户/私人的任何想法   给定所述方法的一个特定用户的会话数据   SetUserData()SetPrivateConversationData()都已弃用?

您必须使用IBotDataStore<BotData>接口方法:

public interface IBotDataStore<T>
{
    /// <summary>
    /// Return BotData with Data pointing to a JObject or an empty BotData() record with ETag:""
    /// </summary>
    /// <param name="key"> The key.</param>
    /// <param name="botStoreType"> The bot store type.</param>
    /// <param name="cancellationToken"> The cancellation token.</param>
    /// <returns>Bot record that is stored for this key, or "empty" bot record ready to be stored</returns>
    Task<T> LoadAsync(IAddress key, BotStoreType botStoreType, CancellationToken cancellationToken);

    /// <summary>
    /// Save a BotData using the ETag.
    /// Etag consistency checks
    ///     If ETag is null or empty, this will set the value if nobody has set it yet
    ///     If ETag is "*" then this will unconditionally set the value
    ///     If ETag matches then this will update the value if it is unchanged.
    /// If Data is null this removes record, otherwise it stores
    /// </summary>
    /// <param name="key"> The key.</param>
    /// <param name="botStoreType">The bot store type.</param>
    /// <param name="data"> The data that should be saved.</param>
    /// <param name="cancellationToken"> The cancellation token.</param>
    /// <returns>throw HttpException(HttpStatusCode.PreconditionFailed) if update fails</returns>
    Task SaveAsync(IAddress key, BotStoreType botStoreType, T data, CancellationToken cancellationToken);
    Task<bool> FlushAsync(IAddress key, CancellationToken cancellationToken);
}

这些方法对于user / privateConversation / conversation数据是通用的。