【发布时间】: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