我發現this blog post來自Filip W解釋瞭如何使用過濾器提供程序編寫自己的解決方案。
但是,該框架已經發生了很大變化,他的解決方案必須進行更新,以考慮框架中的變化,最多可達beta8。
首先,您將創建一個新屬性,您可以在其中指定要重寫的篩選器的類型。 (在你的情況,這將是AuthorizeFilter
)
public class OverrideFilter : ActionFilterAttribute
{
public Type Type { get; set; }
}
如果你想要的。您可以創建更具體的過濾器,如:
public class OverrideAuhorization : OverrideFilter
{
public OverrideAuhorization()
{
this.Type = typeof(AuthorizeFilter);
}
}
然後,你需要創建一個新的IFilterProvider
。
- 該過濾器提供程序將在框架運行後的默認提供程序 後執行。
- 您可以檢查
FilterProviderContext.Results
並搜索OverrideFilter
- 如果找到了,然後你可以檢查過濾器的其餘部分,並刪除 任何過濾器是過濾型的和較低的範圍
例如創建一個新的OverrideFriendlyFilterProvider
以下這樣的想法:
public class OverrideFriendlyFilterProvider : IFilterProvider
{
//all framework providers have negative orders, so ours will come later
public int Order => 1;
public void OnProvidersExecuting(FilterProviderContext context)
{
if (context.ActionContext.ActionDescriptor.FilterDescriptors != null)
{
//Does the action have any OverrideFilter?
var overrideFilters = context.Results.Where(filterItem => filterItem.Filter is OverrideFilter).ToArray();
foreach (var overrideFilter in overrideFilters)
{
context.Results.RemoveAll(filterItem =>
//Remove any filter for the type indicated in the OverrideFilter attribute
filterItem.Descriptor.Filter.GetType() == ((OverrideFilter)overrideFilter.Filter).Type &&
//Remove filters with lower scope (ie controller) than the override filter (ie action method)
filterItem.Descriptor.Scope < overrideFilter.Descriptor.Scope);
}
}
}
public void OnProvidersExecuted(FilterProviderContext context)
{
}
}
您需要註冊在你啓動類的``ConfigureServices`:
services.TryAddEnumerable(
ServiceDescriptor.Singleton<IFilterProvider, OverrideFriendlyFilterProvider>());
所有這些片段都可以覆蓋授權過濾器(或任何其他過濾器)。
例如,在新的MVC應用程序的默認HomeController中,任何登錄的用戶將能夠訪問首頁行動,但只有管理員角色的那些將能夠訪問關於行動:
[Authorize]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
[Authorize(Roles = "admin"), OverrideAuhorization]
public IActionResult About()
{
return View();
}