gpt4 book ai didi

authorization - ASP.NET 5 中的 OverrideAuthorizationAttribute

转载 作者:行者123 更新时间:2023-12-02 03:20:49 26 4
gpt4 key购买 nike

我想在 MVC6 中实现以下内容:

[Authorize(Roles = "Shopper")]
public class HomeController
{
[Authorize(Roles = "Editor"), OverrideAuthorization]
public IActionResult EditPage() {}
}

但是 OverrideAuthorizationAttribute 不再存在。那么你如何设置它以便用户只需要在 Editor角色而不是 EditorShopper在 MVC6 中访问 EditPage 的角色?

最佳答案

我找到了 this blog post来自 菲利普·W 这解释了如何使用过滤器提供程序编写您自己的解决方案。
然而框架已经发生了很大变化,他的解决方案必须更新以考虑到框架中的变化,直到 beta8 .
首先,您将创建一个新属性,您可以在其中指定 的类型。过滤器 你想要覆盖的。 (在您的情况下,这将是 AuthorizeFilter )

public class OverrideFilter : ActionFilterAttribute
{
public Type Type { get; set; }
}
如果你想。您可以创建更具体的过滤器,例如:
public class OverrideAuthorization : OverrideFilter
{
public OverrideAuthorization()
{
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 (i.e. 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"), OverrideAuthorization]
    public IActionResult About()
    {
    return View();
    }

    关于authorization - ASP.NET 5 中的 OverrideAuthorizationAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33558095/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com