簡體   English   中英

DI 到 ASP.NET MVC 6 中的要求/策略

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM