我有一个无法解决的情况:

我正在为我的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.ViewDatafilterContext.Controller.TempData应该在OnAuthorization方法中起作用。最后,如果您希望使用UrlHelper(在这种情况下,因为RedirectToRouteResult更好,因此不需要),可以实例化它:

var urlHelper = new UrlHelper(filterContext.RequestContext);

10-04 13:38