我正在尝试将特定用户的documentdb权限从我的azure服务器发送到我的客户端应用程序,这些是xamarin表单。
在服务器端,一切看起来都不错,我可以看到用户特定的权限和令牌。
但是当客户端收到权限时,令牌会被剥夺,为什么? 我是documentdb的新手,所以希望它只是我。
我使用Azure移动应用服务作为后端。 我的后端控制器返回一个包含documentdb数据库属性的对象,包括用户的权限列表。
>>> import itertools as it
>>> list(it.chain.from_iterable(item if isinstance(item,collections.Iterable) and not isinstance(item, str) else [item] for item in nested))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
如果尚未创建整个集合,我为用户创建权限。
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;
}
}
在我的Xamarin表单应用程序的客户端,我使用此调用到后端的自定义控制器。
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;
}
当我查看dbConfig对象中的permissionlist时,权限的标记为null。我的想法是我可以根据权限列表实例化一个documentdb客户端,但它失败了。
var parameters = new Dictionary<string, string> { { "userid", Settings.AzureUserId } };
dbConfig = await client.InvokeApiAsync<DbConfig>("Settings", HttpMethod.Get, parameters);
来自答案的编辑
只是为了完成问题。 我创建了一个包含Permission和Token
的自定义类 public void CreateDocumentDbClient(DbConfig config)
{
client = new DocumentClient(new Uri(config.EndPointUri), config.Permissions);
collectionLink = UriFactory.CreateDocumentCollectionUri(config.DatabaseName, config.CollectionId);
IsInitialized = true;
}
这样就可以像这样创建一个documentdb客户端:
public class PermissionCustom
{
public Permission Permission { get; set; }
public string Token { get; set; }
}
到目前为止一直很好:-)但是考虑到用户可以拥有不同资源的许多权限,它不会使您的数据库更加安全。即使正确地使其更安全,但令牌首先是只读的。
答案 0 :(得分:0)
根据您的代码,我检查了这个问题,发现我可能会遇到同样的问题。当您调用client.InvokeApiAsync<DbConfig>("Settings", HttpMethod.Get, parameters);
时,您将使用以下链接发送请求:
https://{your-app-name}.azurewebsites.net/api/settings?userid={Settings.AzureUserId}
使用fiddler您可以发现令牌已发送到您的移动客户端,如下所示:
但是当将其反序列化为Permission
时,令牌尚未正确初始化。我发现token属性只读如下:
总之,我建议您需要定义自定义Permission
类,并参考DocumentDB客户端SDK提供的Permission
类,以便在移动设备的自定义权限类中定义所需的属性客户端。