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"))