[英]DI into a Requirement/Policy in ASP.NET MVC 6
我正在尋找一種在 ASP.NET 5 中編寫自定義授權過濾器的方法,因為當前的實現依賴於策略/要求,而策略/要求又完全依賴於聲明的使用,因此依賴於無數且不斷變化的身份系統我真的厭倦了(我已經嘗試了所有的口味)。
我有一大堆權限(超過 200 個),我不想將它們編碼為 Claims,因為我有自己的存儲庫,而且檢查它的方法比比較數百個字符串(這就是 Claims 是什么)要快得多到底)。
我需要在每個屬性中傳遞一個參數,該參數應該根據我的自定義權限存儲庫進行檢查:
[Authorize(Requires = enumPermission.DeleteCustomer)]
我知道這不是最常見的情況,但我認為這不是邊緣情況。 我已經嘗試按照@leastprivilege 在他的精彩文章“ASP.NET 5 和 MVC 6 中的安全狀態:授權”中描述的方式來實現它,但我和作者遇到了同樣的問題,他甚至打開了ASP.NET 5 github repo 上的一個問題,已以不太明確的方式關閉:鏈接
知道如何實現這一目標嗎? 也許使用其他類型的過濾器? 在這種情況下,如何?
以下是如何實現此場景的示例:
假設您有一個名為IPermissionStore
的服務,它驗證給定用戶是否具有在屬性上指定的必需權限。
public class MyCustomAuthorizationFilterAttribute : Attribute, IFilterFactory, IOrderedFilter
{
private readonly Permision[] _permissions;
public MyCustomAuthorizationFilterAttribute(params Permision[] permissions)
{
_permissions = permissions;
}
public int Order { get; set; }
public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
{
var store = serviceProvider.GetRequiredService<IPermissionStore>();
return new MyCustomAuthorizationFilter(store, _permissions)
{
Order = Order
};
}
}
public class MyCustomAuthorizationFilter : IAuthorizationFilter, IOrderedFilter
{
private readonly IPermissionStore _store;
private readonly Permision[] _permissions;
public int Order { get; set; }
public MyCustomAuthorizationFilter(IPermissionStore store, params Permision[] permissions)
{
_store = store;
_permissions = permissions;
}
public void OnAuthorization(AuthorizationContext context)
{
// Check if the action has an AllowAnonymous filter
if (!HasAllowAnonymous(context))
{
var user = context.HttpContext.User;
var userIsAnonymous =
user == null ||
user.Identity == null ||
!user.Identity.IsAuthenticated;
if (userIsAnonymous)
{
Fail(context);
}
else
{
// check the store for permissions for the current user
}
}
}
private bool HasAllowAnonymous(AuthorizationContext context)
{
return context.Filters.Any(item => item is Microsoft.AspNet.Authorization.IAllowAnonymous);
}
private void Fail(AuthorizationContext context)
{
context.Result = new HttpUnauthorizedResult();
}
}
// Your action
[HttpGet]
[MyCustomAuthorizationFilter(Permision.CreateCustomer)]
public IEnumerable<string> Get()
{
//blah
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.