gpt4 book ai didi

c# - 结合自定义 AuthorizeAttribute 和 RequireHttpsAttribute

转载 作者:行者123 更新时间:2023-11-30 23:31:16 24 4
gpt4 key购买 nike

我有一个自定义的 RequireHttpsAttribute 和一个自定义的 AuthorizeAttribute,我在 FilterConfig 中应用它们以确保所有 Controller 都使用 HTTPS 并在相同的环境中进行授权方式。

我还有一个需要其他授权的 Controller 操作。在这种情况下,我必须首先使用 [OverrideAuthorization] 来覆盖全局授权过滤器,然后我可以为此操作设置特殊授权。

[OverrideAuthorization] 也将覆盖 CustomRequireHttpsAttribute,因为它也继承自 IAuthorizationFilter。我该怎么做才能不必在每次覆盖授权时都重新添加 CustomRequireHttpsAttribute 属性?

public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomRequireHttpsAttribute());
filters.Add(new CustomAuthorizeAttribute(Role = "User"));
}
}

public class MyController : BaseController
{
public ActionResult DoSomeUserStuff()
{
}

[OverrideAuthorization]
[CustomRequireHttpsAttribute]
[CustomAuthorizeAttribute(Role = "Admin")]
public ActionResult DoSomeAdminStuff()
{
}
}

最佳答案

我最终基于 this 的修改版本创建了自己的自定义 IFilterProvider发布。

我添加了一个额外的属性,我可以将其用于那些我想覆盖全局设置的属性的 Controller 或操作。它除了扩展 CustomAuthorizeAttribute 之外什么也没做,因此它具有相同的功能:

public class OverrideCustomAuthorizeAttribute : CustomAuthorizeAttribute {}

然后我创建一个 IFilterProvider 来检查过滤器列表中是否存在任何 OverrideCustomAuthorizeAttribute。如果是这样,从列表中删除所有 CustomAuthorizeAttribute:

public class CustomFilterProvider : IFilterProvider
{
private readonly FilterProviderCollection _filterProviders;

public CustomFilterProvider(IList<IFilterProvider> filters)
{
_filterProviders = new FilterProviderCollection(filters);
}

public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
var filters = _filterProviders.GetFilters(controllerContext, actionDescriptor).ToArray();

var shouldOverrideCustomAuthorizeAttribute = filters.Any(filter => filter.Instance is OverrideCustomAuthorizeAttribute);
if (shouldOverrideCustomAuthorizeAttribute)
{
// There is an OverrideCustomAuthorizeFilterAttribute present, remove all CustomAuthorizeAttributes from the list of filters
return filters.Where(filter => filter.Instance.GetType() != typeof(CustomAuthorizeAttribute));
}

return filters;
}
}

我在 Global.asax.cs 中注册了这个 IFilterProvider:

public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// Some other stuff first....

var providers = FilterProviders.Providers.ToArray();
FilterProviders.Providers.Clear();
FilterProviders.Providers.Add(new CustomFilterProvider(providers));
}
}

然后我像以前一样在 FilterConfig.cs 中注册全局 CustomAuthorizeAttribute:

public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomRequireHttpsAttribute());
filters.Add(new CustomAuthorizeAttribute(Role = "User"));
}
}

区别在于我在 Controller 中使用 OverrideCustomAuthorizeAttribute 代替:

public class MyController : BaseController
{
public ActionResult DoSomeUserStuff()
{
}

[OverrideCustomAuthorizeAttribute(Role = "Admin")]
public ActionResult DoSomeAdminStuff()
{
}
}

这样,CustomRequireHttpsAttribute 始终在全局设置并且永远不会被覆盖。

关于c# - 结合自定义 AuthorizeAttribute 和 RequireHttpsAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34658984/

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