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 に答える