0

コントローラ上ではなく動作しますカスタムAuthorizeAttributeは、私は、カスタムAuthorizeAttributeを作成する方法

public AjaxAwareAuthorizeAttribute : AuthorizeAttribute { 
    public override void OnAuthorization(AuthorizationContext filterContext) { 
     base.OnAuthorization(filterContext); 
     if(filterContext.Result is HttpUnauthorizedResult && filterContext.HttpContext.Request.IsAjaxRequest()) { 
      filterContext.HttpContext.Items["RequestWasNotAuthorized"] = true; 
     } 
    } 
} 

私はコントローラクラスにこれを適用するとOnAuthorizationイベントが発射されると予想されるように上記のハンドラが実行されますが、それが適用されるときコントローラ内のどのメソッドにも、何も起こりません!

+0

私のマシンで動作します。コントローラのメソッドがヒットしたことは確かですか?彼らは到達可能ですか?あなたはステップスルーできますか?私は確かにできる。 –

+0

はいコントローラメソッド内にブレークポイントが設定されていて、ヒットしていますが、属性内のOnAuthorizationメソッドが実行されることはありません。おそらく、最初にそれをコード化したときに、これが動作していたと私は確信しています。コードはhttp://trycatchfail.com/blog/post/Handling-Authorization-Failures-for-AJAX-Requests-in-ASPNET-MVC-Applications.aspx – Mike

+0

の属性/バリデータークラスをアプリに登録しましたブートストラップまたはGlobal.asax? – BentOnCoding

答えて

0

私はRobotsushiにここでクレジットをあげたいと思いますが、彼は答えを返さなかったのです。

私のコードで実際に問題があったのは、CustomFilterAttributeFilterProviderコードでした。

protected override IEnumerable<FilterAttributes> GetActionAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { 

//incorrect code 
//var attributes = base.GetControllerAction(controllerContext, actionDescriptor); 

//correct code 
var attributes = base.GetActionAttributes(controllerContext, actionDescriptor); 
0

ここに何かがあります!

私は自分のブートストラップコードに次があります。

var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider); 
FilterProviders.Providers.Remove(oldProvider); 

var newProvider = new CustomFilterAttributeFilterProvider(kernel); 
FilterProviders.Providers.Add(newProvider); 

これは私がカスタム属性を追加した後に追加されたコードでした。これらのコード行を削除すると、属性は予期したとおりに起動します。

関連する問題