我正在尝试将特定用户的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对象中的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 回答
根据您的代码,我已经检查了这个问题,发现我可能会遇到同样的问题 . 当您调用
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
类,以便在移动客户端的自定义权限类中定义所需的属性 .