给出以下控制器
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
。但是,如果我想查看允许某个用户阅读哪些帐户,我就输了。
假设我有一位经理用户,他应该能够阅读他作为经理的所有账户,而非经理用户应该只能阅读他们自己的账户。
是否有最好的做法,或者你之前做过类似的事情并给我一些提示来寻找?
答案 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}}