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

Entity framework 在Web Api 2 OData端点中使用基于声明的授权保护实体,entity-framework,claims-based-identity,asp.net-web-api2,asp.net-authorization,Entity Framework,Claims Based Identity,Asp.net Web Api2,Asp.net Authorization,给定以下控制器 namespace MyNamespace.Api.Controllers { [Authorize] public class AccountController : ODataController { private Entities db = new Entities(); // GET odata/Account [Queryable] [ClaimsPrincipalPermiss

给定以下控制器

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();
        }

        ...

    }

}
这仅在我可以检查当前负责人一般是否可以读取帐户时有用。然而,如果我想检查某个用户可以阅读哪些帐户,我就迷路了

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


有这样的最佳实践吗?或者您以前是否做过类似的事情,并给我一些提示来寻找?

我不使用
ClaimsPrincipalPermissionAttribute
,因为我无法像从您的示例中请求的帐户那样向其传递任何动态参数

请参阅第97页的“Pro APS.NET Web API安全性”一书。他们建议通过代码
new IdentityConfiguration().ClaimsAuthorizationManager.CheckAccess(context)
从控制器操作实现中调用AuthorizationManager,其中
context
是手动构造的,因此您可以传递请求的
帐户(例如)作为
资源
在您的
授权管理器
实现中检查它

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

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

我的案例是:角色管理员是按国家分配的,每个管理员只能看到与他们有权访问的国家相关的实体

更新:在几个项目之后,我忘记了基于声明的安全性,因为这是进行安全检查的极其困难的方法。今天,我使用decorator模式来完成所有的安全检查。即使在OData控制器中,实现安全性似乎也非常容易:

公共可查询MyQuriableEntitySet
{
获取{return implementationWithoutSecurity.MyQuriableEntitySet.Where(e=>e.Country.Code=currentUser.AssignedTo.CountryCode | | currentUser.IsSuperAdmin);}
}

太好了:)更多阅读。他们说印刷业正在消亡,但我不敢苟同。当然有Kindle,但我更喜欢印刷品。
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);
    }
}