代码之家  ›  专栏  ›  技术社区  ›  DM.

授权属性中的urlhelper和viewContext

  •  7
  • DM.  · 技术社区  · 14 年前

    我有一个无法解决的方案:

    我在玩弄为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有什么想法吗?

    1 回复  |  直到 14 年前
        1
  •  11
  •   Darin Dimitrov    14 年前

    您可以覆盖 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 应该在里面工作 授权的 方法。最后,如果你想使用 UrlHelper (在这种情况下,没有必要,因为 RedirectToRouteResult 更好)您可以实例化它:

    var urlHelper = new UrlHelper(filterContext.RequestContext);