我有一个我无法解决的场景:
我正在为mvc创建自己的自定义授权属性.我想添加的主要功能是能够更改用户重定向的位置(如果用户不在某个角色中).我不介意系统将它们发送回登录页面,如果它们未经过身份验证,但我想选择在哪里发送它们,如果它们经过身份验证但不允许访问该操作方法.
这是我想做的事情:
public class CustomAuthorizeAttribute : AuthorizeAttribute { public string Action; public string Controller; protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) { // if User is authenticated but not in the correct role string url = Url.Action(this.Action,this.Controller); httpContext.Response.Redirect(url); } }
作为一个额外的奖励,我希望在进行重定向之前可以访问ViewContext和TempData.
有关如何在属性中实例化UrlHelper和ViewContext的任何想法?
解决方法
您可以覆盖
OnAuthorization
方法:
public override void OnAuthorization(AuthorizationContext filterContext) { if (filterContext == null) { throw new ArgumentNullException("filterContext"); } // Call the AuthorizeCore which should return true or false if (!this.AuthorizeCore(filterContext.HttpContext)) { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary() { { "controller","home" },{ "action","about" },{ "id","foo" },}); } }
就ViewData和TempData而言:filterContext.Controller.ViewData和filterContext.Controller.TempData应该在OnAuthorization方法中工作.最后,如果你想使用UrlHelper(在这种情况下没有必要,因为RedirectToRouteResult更好)你可以实例化它:
var urlHelper = new UrlHelper(filterContext.RequestContext);