权限中的令牌使用 documentdb 和 xamarin 形式消失
Token in permissions dissapears using documentdb and xamarin forms
我正在尝试将特定用户的 documentdb 权限从我的 azure 服务器发送到我的客户端应用程序,这是 xamarin 表单。
在服务器端,一切看起来都很好,我可以看到用户特定的权限和令牌。
但是当在客户端收到权限时,令牌被剥离,为什么?
我是 documentdb 的新手,所以希望这只是我。
我正在使用 Azure 移动应用服务作为后端。
我的后端控制器 returns 一个包含 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;
}
根据答案进行的编辑
只是为了结束问题。
我创建了一个自定义 class 同时持有 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);
到目前为止一切顺利 :-) 但考虑到用户可能对不同资源拥有许多权限,它并不能使保护数据库变得更容易。尽管使它更安全是正确的,但令牌首先是只读的。
根据你的代码,我检查了这个问题,发现我也可能遇到同样的问题。当您调用 client.InvokeApiAsync<DbConfig>("Settings", HttpMethod.Get, parameters);
时,您将发送带有以下内容的请求 link:
https://{your-app-name}.azurewebsites.net/api/settings?userid={Settings.AzureUserId}
使用fiddler您会发现令牌已经发送到您的手机客户端,如下所示:
但是在反序列化为Permission
的时候,token没有正确初始化。我发现令牌 属性 是只读的,如下所示:
综上所述,我建议您需要自定义Permission
class,并参考DocumentDB客户端SDK提供的Permission
class定义属性您需要在您的移动客户端中自定义权限 class。
我正在尝试将特定用户的 documentdb 权限从我的 azure 服务器发送到我的客户端应用程序,这是 xamarin 表单。
在服务器端,一切看起来都很好,我可以看到用户特定的权限和令牌。
但是当在客户端收到权限时,令牌被剥离,为什么? 我是 documentdb 的新手,所以希望这只是我。
我正在使用 Azure 移动应用服务作为后端。 我的后端控制器 returns 一个包含 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;
}
根据答案进行的编辑
只是为了结束问题。 我创建了一个自定义 class 同时持有 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);
到目前为止一切顺利 :-) 但考虑到用户可能对不同资源拥有许多权限,它并不能使保护数据库变得更容易。尽管使它更安全是正确的,但令牌首先是只读的。
根据你的代码,我检查了这个问题,发现我也可能遇到同样的问题。当您调用 client.InvokeApiAsync<DbConfig>("Settings", HttpMethod.Get, parameters);
时,您将发送带有以下内容的请求 link:
https://{your-app-name}.azurewebsites.net/api/settings?userid={Settings.AzureUserId}
使用fiddler您会发现令牌已经发送到您的手机客户端,如下所示:
但是在反序列化为Permission
的时候,token没有正确初始化。我发现令牌 属性 是只读的,如下所示:
综上所述,我建议您需要自定义Permission
class,并参考DocumentDB客户端SDK提供的Permission
class定义属性您需要在您的移动客户端中自定义权限 class。