gpt4 book ai didi

entity-framework - 在 Web Api 2 OData 端点中使用基于声明的授权保护实体

转载 作者:行者123 更新时间:2023-12-04 07:28:01 25 4
gpt4 key购买 nike

给定以下 Controller

namespace MyNamespace.Api.Controllers
{
[Authorize]
public class AccountController : ODataController
{
private Entities db = new Entities();

// GET odata/Account
[Queryable]
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation = "Read", Resource = "Account")]
public IQueryable<Account> GetAccount()
{
return db.Accounts();
}

...

}

}

我覆盖了 ClaimsAuthorizationManager.CheckAccess(...)

public class AuthorizationManager : ClaimsAuthorizationManager
{
public override bool CheckAccess(AuthorizationContext context)
{
var resource = context.Resource.First().Value;
var action = context.Action.First().Value;

return Policies.Validate(resource, action);
}
}

这仅在我可以检查Current Principal in general 是否可以Read Account< 时有用。但是,如果我想检查允许某个用户阅读哪些帐户,我就迷路了。

假设我有一个经理用户,他应该能够读取他作为经理的所有帐户,而非经理用户应该只能读取他们自己的帐户。

是否有这方面的最佳实践,或者您以前是否做过类似的事情并给我一些提示以供引用?

最佳答案

我不使用 ClaimsPrincipalPermissionAttribute,因为我无法将任何动态参数传递给它,例如从您的示例中请求的帐户。

查看“Pro APS.NET Web API Security”一书第 97 页。他们建议通过代码 new IdentityConfiguration().ClaimsAuthorizationManager.CheckAccess(context) 从 Controller 操作实现中调用 AuthorizationManager >,其中 context 是手动构造的,因此您可以将请求(例如)的 Account 作为 Resource 传递给您的 AuthorizationManager 实现。

另请参阅 pluralsight 培训“.NET 4.5 中的身份和访问控制简介”。还有一些关于如何在 Web API 中实现基于声明的安全性的信息。

现在我正在实现您所说的安全性,我对这个主题也很感兴趣。

我的情况是:管理员角色由国家/地区分配,每个管理员只能看到与他们有权访问的国家/地区相关的实体。

更新:在几个项目之后,我忘记了基于声明的安全性,因为这是进行安全检查的极其困难的方法。今天我在完成所有安全检查的地方使用装饰器模式。即使在像这样的 OData Controller 中,实现安全性似乎也非常容易:
公共(public) IQueriable MyQuriableEntitySet
{
get{ return implementationWithoutSecurity.MyQuriableEntitySet.Where(e=>e.Country.Code = currentUser.AssignedTo.CountryCode || currentUser.IsSuperAdmin); }
}

关于entity-framework - 在 Web Api 2 OData 端点中使用基于声明的授权保护实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21257553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com