9

私のカスタム AuthorizeAttribute が私の MVC WebApi で機能しない理由を見つけようとして、私はインターネットのいたるところにいました。SOでこの種のことについて尋ねる人を見てきましたが、私の問題を解決するのにまだ何も役立っていません:

 [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, 
                 Inherited = false)]
    public sealed class CustomAuthorization : AuthorizeAttribute
    {

        //...

         protected override bool AuthorizeCore(HttpContextBase httpContext)
        { 
           // custom auth logic, returns true if authorized, false otherwise
        }
    }

System.Web.Mvcとは対照的にから拡張していSystem.Web.Httpます。しかし、私のAuthorizeCore(HttpContextBase httpContext)は決して呼び出されません。

CustomAuthorizationクラスにはparams string[]、特定のアクションに必要なカスタム権限の名前である を受け取るコンストラクターがあります。

[CustomAuthorization("Some Permission")]
[System.Web.Http.HttpGet]
public CustomResponse SomeAction()
{
   //...
}

私が達成したいと思っていることは、[CustomAuthorization]属性で装飾されたアクションに対してリクエストが行われるたびに、認証コードが起動されるようにすることです。また、承認が失敗した場合に、より説明的な認証失敗メッセージを返せるようにしたいと考えています。だけでなく:

{"Message":"Authorization has been denied for this request."} 

これにはオーバーライドHandleUnauthorizedRequestが含まれると思いますが、JSON 応答がシリアル化する独自のオブジェクトを提供するにはどうすればよいですか?

要約すると、アクションを自分の[CustomAuthorization]属性で装飾しても、フレームワークによって承認コードが呼び出されることはありません。アクション内のコードを実行するだけです。

第 2 に、カスタム JSON オブジェクトをシリアル化するための無許可の応答を実装するにはどうすればよいですか?

事前にご協力いただきありがとうございます。

4

1 に答える 1

6

わかりました、私は最終的にそれを解決しました、そしてこれはどのようにです:

public override void OnAuthorization(HttpActionContext actionContext) {

    ....

    if (!authorized) {

       actionContext.Response =    
                  actionContext.Request.CreateResponse(
                                   HttpStatusCode.Unauthorized, 
                                   new  Dictionary<string, string> { 
                                                { "hello", "world" } 
                                   }
                  );

    }

}

結果は次のとおりです。

{"hello":"world"}

Dictionaryオブジェクトは任意であり、型が応答に正常にシリアル化されることを示しているだけです。

を設定しない場合actionContext.Response、リクエストはターゲットアクションに進みます-つまり。このフィルターによって承認されたと見なされます。

それがこの立場にいる他の人々を助けることを願っています。

于 2013-03-20T22:16:59.073 に答える