Asp.net mvc 4 如何在授权筛选器MVC 4之前执行操作筛选器
通过继承Asp.net mvc 4 如何在授权筛选器MVC 4之前执行操作筛选器,asp.net-mvc-4,custom-attributes,Asp.net Mvc 4,Custom Attributes,通过继承AuthorizeAttribute类,我在MVC4中实现了自己的自定义授权属性。我还有一个自定义的ActionFilterAttribute。这两种方法都很好,但问题在于如何对它们进行排序。我需要在自定义授权筛选器之前运行自定义操作筛选器 我已尝试对属性使用Order属性,但据我所知,授权筛选器将始终在操作筛选器之前运行 是否有人知道如何在授权筛选器之前强制执行操作筛选器???当您查看源代码(可在上获得)时,您会发现这在标准筛选器类中是不可能的IAuthorizationFilter实
AuthorizeAttribute
类,我在MVC4中实现了自己的自定义授权属性。我还有一个自定义的ActionFilterAttribute
。这两种方法都很好,但问题在于如何对它们进行排序。我需要在自定义授权筛选器之前运行自定义操作筛选器
我已尝试对属性使用Order
属性,但据我所知,授权筛选器将始终在操作筛选器之前运行
是否有人知道如何在授权筛选器之前强制执行操作筛选器???当您查看源代码(可在上获得)时,您会发现这在标准筛选器类中是不可能的<代码>IAuthorizationFilter实现总是在
IActionFilter
实现之前执行。这是因为当授权筛选器返回结果时,操作筛选器不会运行
要解决此问题,您可以创建自己的ControllerActionInvoker
子类,并重写InvokeAction
方法:
public class MyControllerActionInvoker : ControllerActionInvoker
{
public override bool InvokeAction(ControllerContext controllerContext, string actionName)
{
// Your initialization code here
try
{
return base.InvokeAction(controllerContext, actionName);
}
finally
{
// Your finalization code here
}
}
}
您需要将自定义的MyControllerActionInvoker
类注入到自定义的ControllerFactory
类中的控制器中:
public class MyControllerFactory : DefaultControllerFactory
{
private readonly MyControllerActionInvoker actionInvoker = new MyControllerActionInvoker();
/// <summary>
/// Retrieves the controller instance for the specified request context and controller type.
/// </summary>
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
var controllerInstance = base.GetControllerInstance(requestContext, controllerType);
if (controllerInstance != null)
{
var typedController = controllerInstance as Controller;
if (typedController != null)
{
typedController.ActionInvoker = this.actionInvoker;
}
}
return controllerInstance;
}
}
此实现在这里工作正常。授权筛选器检查用户是否有权限,如果没有权限,则没有必要检查其他任何内容。听起来你在做一些奇怪的事情。也许可以解释一下为什么要交换它们。操作过滤器会检查特定用户是否有临时密码,因此我希望在出现“更改密码”页面并显示“未经授权”之前,将其重定向到“更改密码”页面。希望这是有意义的…在这种情况下,听起来你还是希望拥有临时密码的人无法通过授权检查,但如果他们有临时密码,你只想在“未授权”页面中进行检查,然后重定向到“更改密码”页面。或者,您可以在登录时捕获此信息,并在允许他们登录之前强制他们更改密码。那你就不用担心了。
var controllerFactory = new MyControllerFactory();
ControllerBuilder.Current.SetControllerFactory(controllerFactory);