首页 文章

权限中的令牌使用documentdb和xamarin表单消失

提问于
浏览
0

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

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

Server side

但是当在客户端收到权限时,令牌被剥夺了,为什么?我是documentdb的新手,所以希望它只是我 .

Client side

我使用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对象中的permissionlist时,权限的标记为null . 我的想法是我可以基于权限列表实例化一个documentdb客户端,但它失败了 .

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

EDITS MADE FROM ANSWER

只是为了完成问题 . 我创建了一个包含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);

到目前为止一直很好:-)但考虑到用户可以拥有不同资源的许多权限,它并不会使您更容易保护数据库 . 即使正确地使其更安全,但令牌首先是只读的 .

1 回答

  • 0

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

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

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

    enter image description here

    但是当将其反序列化为 Permission 时,令牌尚未正确初始化 . 我发现token属性只读如下:

    enter image description here

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

相关问题