是否可以在自定义的AuthorizeAttribute类中使用RedirectToAction()?
使用ASP.Net MVC 2,是否有任何方法来使用基于AuthorizeAttribute
类的类内的Controller类的RedirectToAction()方法?
public class CustomAttribute : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase context) { // Custom authentication goes here return false; } public override void OnAuthorization(AuthorizationContext context) { base.OnAuthorization(context); // This would be my ideal result context.Result = RedirectToAction("Action", "Controller"); } }
我正在寻找一种方式来重新引导用户到特定的控制器/操作时,他们authentication失败,而不是返回到login页面。 是否有可能为该控制器/操作生成redirect URL,然后使用RedirectResult() ? 我试图避免对url进行硬编码的诱惑。
你可以/应该重写HandleUnauthorizedRequest
而不是OnAuthorization
。 这是默认的实现:
protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) { // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. filterContext.Result = new HttpUnauthorizedResult(); }
你不能使用Controller.RedirectToAction
,但你可以返回一个新的RedirectToRouteResult
。
所以你可以这样做:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary { { "action", "ActionName" }, { "controller", "ControllerName" } }); }
你可以做这样的事情:
var routeValues = new RouteValueDictionary(); routeValues["controller"] = "ControllerName"; routeValues["action"] = "ActionName"; //Other route values if needed. context.Result = new RedirectToRouteResult(routeValues);
当您在控制器中调用“RedirectToAction()”时,框架就是这样做的。
以防其他人对这个问题感兴趣。 这可以用一个更简单的方法解决(至less使用MVC 3,不知道MVC 2):
只需在您的自定义AuthorizeAttribute中创build一个小型私人控制器:
private class RedirectController : Controller { public ActionResult RedirectWhereever() { return RedirectToAction("Action", "Controller"); } }
这可以很容易地在你的HandleUnauthorizedRequest方法中使用(见Craigs答案):
filterContext.Result = (new RedirectController()).RedirectWhereever();