Azure移动应用程序脱机同步 - 不同的用户

时间:2017-07-19 04:20:15

标签: c# azure azure-mobile-services

现状

我创建了一个使用Azure SDK进行离线数据同步的应用。同步工作正常,包括通过Microsoft帐户进行用户身份验证在Azure中,我目前使用Easy Tables。

问题

现在,当我从两个不同的测试设备登录两个不同的用户时,我可以看到相同的数据。我的期望是,经过身份验证的用户只能看到使用自己的用户ID添加/更新的用户。

实际问题

通过设计,所有经过身份验证的用户是否都能看到来自所有其他用户的数据?那么我是否必须添加一些带有用户ID的列(基于Microsoft帐户ID)并在获取数据时向where子句添加条件? (这很奇怪,因为所有数据都会同步到所有用户)

我正在查看文档,但无法找到正确的信息。我还没有为这个问题添加任何代码,因为我不清楚这是否是设计,是否在客户端,或者是否需要调整服务器端的配置。

2 个答案:

答案 0 :(得分:2)

  

同步工作正常,包括通过Microsoft帐户进行用户身份验证。在Azure中,我目前使用Easy Tables。

Easy Tables与Node.js后端一起使用,当通过Easy Tables添加表时,它将帮助您自动为添加的表构建node.js后端。您可以利用"开发工具> App Service Editor(预览版)"在您的Azure门户网站上的移动应用程序下检查您的后端。

  

通过设计,所有经过身份验证的用户是否都能看到来自所有其他用户的数据?那么我是否必须添加一些带有用户ID的列(基于Microsoft帐户ID)并在获取数据时向where子句添加条件?

对于移动客户端,您可以使用Azure Mobile Client SDK与天蓝色移动应用进行关联。假设您使用Server-managed authentication并使用以下代码进行Microsoft帐户登录:

MobileServiceUser user=wait MobileServiceClient.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount);

您可以通过MobileServiceClient.CurrentUser检索记录的用户信息,CurrentUser拥有属性UserId。由于您使用的是Easy Table,因此您只需通过Azure Portal将UserId列添加到每个与用户相关的表中。此外,您需要更改移动客户端应用程序中的相关SQLite表。

对于脱机同步,您可以按如下方式定义OData查询,以便从远程表中检索属于指定用户的项目。

await todoTable.PullAsync("incsync_ToDoTable_CurrentUser", todoTable.CreateQuery().Where(t => t.UserId=="<userId>");

有关详细信息,建议您参考adrian hall的书Data Access and Offline Sync

<强>更新

如有问题:

1)在后端评估的过滤条件以及仅同步给定userId的行,您可以在处理pull时利用Fiddler来捕获网络跟踪操作。

2)对于更安全的方法,您可以调整发送到表控制器的数据,然后再将其存储在服务器端,而不是在移动设备上指定userId客户。对于node.js后端,您可以在插入数据之前按如下方式修改代码:

table.insert(function (context) {
  context.item.userId = context.user.id;
  return context.execute();
});

有关详细信息,请参阅30 DAYS OF ZUMO.V2 (AZURE MOBILE APPS): DAY 6 – PERSONAL TABLES

此外,对于C#后端,您可以按如下方式检索UserId

public string UserId
{
    get
    {
        var principal = this.User as ClaimsPrincipal;
        return principal.FindFirst(ClaimTypes.NameIdentifier).Value;
    }
}

并修改您添加新项目的操作,如下所示:

// POST tables/TodoItem
public async Task<IHttpActionResult> PostTodoItem(TodoItem item)
{
    item.UserId = UserId;
    TodoItem current = await InsertAsync(item);
    return CreatedAtRoute("Tables", new { id = current.Id }, current);
}

有关详细信息,请参阅Per-User Data

答案 1 :(得分:0)

要过滤每个用户的条目,您必须向表中添加UserId列,其中包含拥有该项目的用户的ID。

然后,您可以在客户端应用中过滤表格,只接收当前用户的项目。

或者甚至更好地在服务器端应用过滤器,因此您的客户端应用程序只接收当前登录用户的项目。

但我不确定使用简易表是否可行,您可能必须实现“完整”服务器版本,如此回购的“后端”部分所述:https://github.com/Azure/azure-mobile-apps-quickstarts