【问题标题】:Token in permissions dissapears using documentdb and xamarin forms使用 documentdb 和 xamarin 表单中的权限令牌消失
【发布时间】:2017-11-09 02:16:56
【问题描述】:

我正在尝试将特定用户的 documentdb 权限从我的 azure 服务器发送到我的客户端应用程序,这些应用程序是 xamarin 表单。

在服务器端,一切看起来都不错,我可以看到用户的特定权限和令牌。

但是当客户端收到权限时,令牌被剥离,为什么? 我是 documentdb 的新手,所以希望只有我自己。

我使用 Azure 移动应用服务作为后端。 我的后端控制器返回一个包含 documentdb 数据库属性的对象,包括用户权限列表。

    public class DbConfig
{
    public string DatabaseName { get; set; }
    public string CollectionId { get; set; }
    public string EndpointUri { get; set; }
    public IList<Permission> Permissions { get; set; }

}

如果尚未创建,我会为用户创建整个集合的权限。

        public async Task<Permission> CreatePermissionAsync(string resourceLink, string userLink, PermissionMode mode, string resourcePartitionKey = null)
    {
        try
        {

            Permission permission = new Permission
            {
                Id = Guid.NewGuid().ToString("N"),
                PermissionMode = mode,
                ResourceLink = resourceLink
            };

            if (resourcePartitionKey != null)
            {
                permission.ResourcePartitionKey = new PartitionKey(resourcePartitionKey);
            }

            var result = await client.CreatePermissionAsync(userLink, permission);
            DbConfig.Permissions.Add(result);
            return result;
        }
        catch (Exception e)
        {
            Trace.WriteLine($"##### Exception: {e}");
            throw;
        }
    }

我使用此方法检索用户的权限。

        public List<Permission> GetPermissionsForUserPermissionLink(User user)
    {
        var permFeed = client.CreatePermissionQuery(user.PermissionsLink);
        List<Permission> permList = new List<Permission>();

        foreach (Permission perm in permFeed)
        {
            permList.Add(perm);
            DbConfig.Permissions.Add(perm);
        }

        return permList;
    }

在我的 Xamarin 表单应用程序的客户端,我将此调用用于后端的自定义控制器。

var parameters = new Dictionary<string, string> { { "userid", Settings.AzureUserId } };
dbConfig = await client.InvokeApiAsync<DbConfig>("Settings", HttpMethod.Get, parameters);

当我查看 dbConfig 对象中的权限列表时,权限的令牌为空。我的想法是我可以根据权限列表实例化一个 documentdb 客户端,但它失败了。

        public void CreateDocumentDbClient(DbConfig config)
    {
        client = new DocumentClient(new Uri(config.EndPointUri), config.Permissions);
        collectionLink = UriFactory.CreateDocumentCollectionUri(config.DatabaseName, config.CollectionId);
        IsInitialized = true;
    }

根据答案进行的编辑

只是为了完成问题。 我创建了一个同时持有 Permission 和 Token 的自定义类

    public class PermissionCustom
{
    public Permission  Permission { get; set; }
    public string Token { get; set; }
}

这样就可以像这样创建一个 documentdb 客户端:

client = new DocumentClient(new Uri(config.EndPointUri), config.Permissions[0].Token);

到目前为止一切都很好 :-) 但考虑到用户可能对不同资源拥有许多权限,它并不能更轻松地保护您的数据库。尽管可以适当地使其更安全,但令牌首先是只读的。

【问题讨论】:

  • 您的意思是您使用CreatePermissionAsync 为特定用户生成权限或检索创建的权限,然后发送到您的移动客户端?你的后端是什么(天蓝色的移动应用程序或网络 API)?能否提供后端发送权限的代码和移动应用接收响应的代码?
  • 刚刚用代码更新了问题,谢谢
  • 感谢布鲁斯的回答

标签: azure xamarin xamarin.forms azure-cosmosdb


【解决方案1】:

根据您的代码,我检查了这个问题,发现我可能会遇到同样的问题。当您调用client.InvokeApiAsync&lt;DbConfig&gt;("Settings", HttpMethod.Get, parameters); 时,您将使用以下链接发送请求:

https://{your-app-name}.azurewebsites.net/api/settings?userid={Settings.AzureUserId}

通过fiddler,您可以发现令牌已发送到您的移动客户端,如下所示:

但是反序列化为Permission时,token没有被正确初始化。我发现token属性只读如下:

总的来说,我建议您需要定义您的自定义 Permission 类,并参考 DocumentDB 客户端 SDK 提供的 Permission 类,以在您的移动客户端的自定义权限类中定义您需要的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多