7

我有一个我无法解决的场景:

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

4

1 回答 1

11

您可以覆盖该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);
于 2010-04-18T07:23:19.817 回答