6

ActionFilter属性を使用して、 OnActionExecutingイベントをインターセプトし、Web APIコードでトークン検証を実行しようとしています...以下は、セキュリティ関連のものを取り除いたコードです(トークンがEntity Frameworkを使用したデータベース):

public class TokenValidationFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var data = new ActionData();
            if (filterContext.HttpContext.Request.QueryString.AllKeys.Contains("token"))
            {
                using (var context = new GNCCustomers()) 
                {
                    data.GNCToken = context.Tokens.Where(t => t.GNCToken == filterContext.HttpContext.Request["token"]).SingleOrDefault();
                    if (data.GNCToken == null)
                    {
                        filterContext.Result = new HttpUnauthorizedResult("MissingOrInvalidToken") ;
                        return;
                    }
                }
                data.HttpVerb = filterContext.HttpContext.Request.HttpMethod;

                foreach (string item in filterContext.HttpContext.Request.QueryString)
                {
                    data.Params.Add(item, filterContext.HttpContext.Request.QueryString[item]);
                }
                data.Path = filterContext.RouteData.Values;

                filterContext.ActionParameters["actionData"] = data;
            }


            base.OnActionExecuting(filterContext);
        }

    }

これをコントローラーの1つのアクションメソッドに次のように適用しました。

public class CustomerController : ApiController
    {
    [HttpPost]        
            [TokenValidationFilterAttribute]
            public HttpResponseMessage Create(ActionData actionData)
            {

                return Request.CreateResponse(HttpStatusCode.OK);
            }...

したがって、問題は、フィルターコードにブレークポイントを設定した場合、最初の行でブレークポイントがヒットしなかったことです。また、いくつかのDebug.Print()スタブを追加して、環境に問題があるかどうかを確認しました...何も...コードが実行されないだけです。

だから、誰もがこれを処理する方法についての手がかりを持っていますか?私はここで解決策をチェックすることに気が狂っており、このactionFiltersはあまり文書化されていないようです。MSDNには1ページしかなく、私がすでに実装したことは何も言っていません...

ありがとう!助けてくれて本当に感謝しています。

よろしく...

4

1 に答える 1

20

System.Web.Mvc.ActionFilterAttributeほとんどの場合、からではなくから派生していSystem.Web.Http.Filters.ActionFilterAttributeます。

1つ目はASP.NETMVCからのもので、2つ目はASP.NET Web APIからのものです-配信元として2つ目が必要ですApiController(したがって、ASP.NETMVCアプリケーション内でASP.NETWeb APIをホストしている可能性があります) 。

于 2012-12-18T14:54:15.377 に答える