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

时间:2014-01-21 12:01:00

标签: 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]
        [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 一般是否可以Read Account。但是,如果我想查看允许某个用户阅读哪些帐户,我就输了。

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

是否有最好的做法,或者你之前做过类似的事情并给我一些提示来寻找?

1 个答案:

答案 0 :(得分:3)

我不使用ClaimsPrincipalPermissionAttribute,因为我无法将任何动态参数传递给它,就像您的样本中请求的帐户一样。

查看“Pro APS.NET Web API安全性”一书第97页。他们建议通过代码new IdentityConfiguration().ClaimsAuthorizationManager.CheckAccess(context)从您的控制器操作实现调用AuthorizationManager,其中context是手动构建的,所以你可以Account请求Resource AuthorizationManager public IQueriable MyQuriableEntitySet { get{ return implementationWithoutSecurity.MyQuriableEntitySet.Where(e=>e.Country.Code = currentUser.AssignedTo.CountryCode || currentUser.IsSuperAdmin); } }在{{1}}实施中进行检查。

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

现在我正在实施你正在谈论的安全性,我对这个主题也感兴趣。

我的情况是:角色管理员是按国家/地区分配的,每个管理员都可以查看仅与他们有权访问的国家/地区相关的实体。

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