同步工作正常,包括通过 Microsoft 帐户进行用户身份验证。在 Azure 中,我目前使用的是 Easy Tables。
Easy Tables 与 Node.js 后端一起使用,当通过 Easy Tables 添加表时,它将帮助您自动为添加的表构建 node.js 后端。您可以在 azure 门户上的移动应用下利用“开发工具 > 应用服务编辑器(预览版)”来检查您的后端。
是否所有经过身份验证的用户都可以查看所有其他用户的数据?那么我是否必须在获取数据时添加一些带有用户 ID(基于 Microsoft 帐户 ID)的列并在 where 子句中添加条件?
对于移动客户端,您可以使用 Azure Mobile Client SDK 连接您的 azure 移动应用。假设您利用 Server-managed authentication 并使用以下代码使用 Microsoft 帐户进行日志记录:
MobileServiceUser user=wait MobileServiceClient.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount);
您可以通过MobileServiceClient.CurrentUser 检索记录的用户信息,CurrentUser 具有属性UserId。由于您使用的是 Easy Table,因此您只需通过 Azure 门户将 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。