C# 索赔和查询数据行

C# 索赔和查询数据行,c#,asp.net-mvc-5,claims-based-identity,C#,Asp.net Mvc 5,Claims Based Identity,在本文()中,建议使用声明对数据行的某些类型的访问进行强制/拒绝 更具体地说,文章提到: public void ProtectedMethod() { ClaimsPrincipalPermission.CheckAccess("bankaccount|1234", "Read"); // Perform protected task. } 在我看来(如果我错了,请纠正我),这表明可以通过索赔管理对数据行(在本例中为银行账号)的访问 到目前为止,我明白了这一点,并认为这是可

在本文()中,建议使用声明对数据行的某些类型的访问进行强制/拒绝

更具体地说,文章提到:

public void ProtectedMethod()
{
    ClaimsPrincipalPermission.CheckAccess("bankaccount|1234", "Read"); 
    // Perform protected task.
}
在我看来(如果我错了,请纠正我),这表明可以通过索赔管理对数据行(在本例中为银行账号)的访问

到目前为止,我明白了这一点,并认为这是可行的(我认为)

现在,假设我想查询一个用户可以访问的所有帐号的列表。在非基于声明的场景中,我们可以查询数据库,如下所示:

var list = db.BankAccounts.Where(c => c.UserId == userId); 
在基于索赔的场景中,这意味着类似(只是一个示例场景):

但这感觉不太对

我是否遗漏了一个关键部分?或者,以这种方式保护对数据行的访问真的不是一个好主意吗

更新

在阅读了Wiktor Zychla的回答和评论后,我仍然感到困惑:目前索赔存储在索赔表中。银行账户存储在另一个表中

所以基本上我认为这是一种选择:

1) 查询银行帐户并与索赔表(或缓存数据)联接


但我仍然不确定这是正确的方法。

声明只是名称-值对。拥有用户id的自定义声明是完全有效的


这意味着您不必坚持使用此
CheckAccess
方法。相反,找到所需的声明(用户名、用户id等),并使用其值,就像在前一个示例中使用id一样。

因此,如果我没有弄错的话,这将建议对声明表进行数据库连接查询?不,是使用声明值的where子句。声明的原始来源在哪里并不重要,只要您有它的值。我想您错过的是,尽管声明物理上存储在某个地方(在表中),但在身份验证时,它们存储在为用户建立本地会话的cookie中。您从那里检索一个声明,而不是从表中检索,以便在当前用户会话中使用它。@WiktorZychla:好的,我确实错过了那个声明。我必须检查我的项目设置。我想我可以使用索赔作为“每行”的授权。但是,为每个数据行的“读/写/删除/等”添加cookie数据将很快破坏cookie。无论如何谢谢:)
var list = db.BankAccounts.Where(c => 
    ClaimsPrincipalPermission.CheckAccess("bankaccount|1234", "Read"))