Mas*_*our 4 asp.net asp.net-mvc
我有一个像这样的自定义操作过滤器:
public class MySecurityTest : ActionFilterAttribut{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//Do some security tests
base.OnActionExecuting(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
我将其添加到FilterConfig所有操作中。但我需要一些操作在没有它的情况下工作。现在我使用这样的东西:
public class MySecurityTest : ActionFilterAttribute
{
public bool CheckRules { get; set; }
public MySecurityTest(bool checkRules = true)
{
CheckRules = checkRules;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (CheckRules)
{
//Do some security tests
}
base.OnActionExecuting(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
和用法:
[MySecurityTest(false)]
public ActionResult Index()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
但如何构建类似[AllowAnonymous]属性的东西
此致
但如何构建类似 [AllowAnonymous] 属性的东西
实际上很简单:
[AttributeUsage(AttributeTargets.Method)]
public class ExcludeMySecurityAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)
然后在你的过滤器帐户中:
public class MySecurityTest : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionDescriptor.GetCustomAttributes(typeof(ExcludeMySecurityAttribute), true).Any())
{
// The controller action is decorated with the exclude attribute
// so you should probably do nothing here
}
else
{
// Do your security tests here
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在剩下的就是装饰了:
[ExcludeMySecurity]
public ActionResult Index()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
您只需创建另一个属性并使用 .NET 反射来检查它是否存在。
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!HasMyIgnoreAttribute(filterContext))
{
//Do some security tests
}
base.OnActionExecuting(filterContext);
}
public bool HasMyIgnoreAttribute(ActionDescriptor actionDescriptor)
{
// Check if the attribute exists on the action method
bool existsOnMethod = actionDescriptor.IsDefined(typeof(MyIgnoreAttribute), false);
if (existsOnMethod)
{
return true;
}
// Check if the attribute exists on the controller
return actionDescriptor.ControllerDescriptor.IsDefined(typeof(MyIgnoreAttribute), false);
}
Run Code Online (Sandbox Code Playgroud)
然后创建一个自定义属性来装饰您的操作/控制器。
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class MyIgnoreAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)
[MySecurity]
public class MyController
{
[MyIgnore]
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
ActionFilterAttribute一般来说,如果您使用依赖注入,最好不要使用,因为属性不应包含此答案中的任何行为。您还应该考虑使用授权过滤器(或 AuthorizationAttribute 继承类)而不是操作过滤器来进行安全检查,因为它是在管道的早期完成的。
| 归档时间: |
|
| 查看次数: |
2223 次 |
| 最近记录: |