在本文(http://www.codemag.com/Article/0001308101)中,建议声明可用于对某些类型的数据行访问进行扩展/拒绝。
更具体一点:文章提到:
public void ProtectedMethod()
{
ClaimsPrincipalPermission.CheckAccess("bankaccount|1234", "Read");
// Perform protected task.
}
在我看来(如果我错了,请纠正我)这表明可以使用声明来管理对数据行的访问(在这种情况下是银行帐号)。
到目前为止,我得到的图片并发现这是可行的(我认为)。
现在,想象一下我想查询用户可以访问的所有帐号的列表。在未声明的场景中,我们可以查询数据库,如:
var list = db.BankAccounts.Where(c => c.UserId == userId);
在基于声明的场景中,它意味着(仅仅是一个示例场景):
var list = db.BankAccounts.Where(c =>
ClaimsPrincipalPermission.CheckAccess("bankaccount|1234", "Read"))
但这感觉不对。
我错过了一个关键部分吗?或者以这种方式保护对数据行的访问不是一个好主意吗?
更新
在阅读了Wiktor Zychla的回答和评论后,我仍然感到困惑:目前索赔存储在索赔表中。 BankAccounts存储在另一个表中。
基本上我认为这是选项:
1)查询银行账户并加入声明表(或缓存数据)。
但我仍然不确定这是正确的方法。
答案 0 :(得分:1)
声明只是一对名称值。拥有用户ID的自定义声明完全有效。
这意味着您不必坚持使用此CheckAccess
方法。相反,找到所需的声明(用户名,用户ID,无论如何)并使用它的值,就像在前一个示例中使用id一样。