3

给定以下控制器

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 can是否有用Read Account。但是,如果我想检查某个用户可以阅读哪些帐户,我就迷路了。

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

对此是否有最佳实践,或者您以前是否做过类似的事情并给我一些提示?

4

1 回答 1

3

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

看一下“Pro APS.NET Web API Security”一书第 97 页。他们建议通过代码从控制器操作实现中调用 AuthorizationManager new IdentityConfiguration().ClaimsAuthorizationManager.CheckAccess(context),其中context手动构建,以便您可以传递Account请求(例如)Resource以在您的AuthorizationManager执行。

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

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

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

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

于 2014-01-23T13:23:13.903 回答