1

以下を使用して CustomAuthenticationHandler ハンドラー内に実装されたロジックを介して処理されるセキュリティをすべて必要とするメソッドを含む Web API サービスがあります。

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    //Security Logic

    //Return Task
}

ただし、セキュリティを必要としない、公開したいメソッドがあります。セキュリティ情報を必要としないこの 1 つの方法のためだけに別のサービスを用意しないようにしています。以下は私がこれを行った方法であり、動作します:

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{

  if (request.RequestUri.AbsolutePath == "/api/MyPublicNoSecurityNeededMethod")
       return base.SendAsync(request, cancellationToken).ContinueWith(task => task.Result);

    //Security Logic

    //Return Task
}

したがって、私は本質的に早期に戻り、セキュリティ ロジックを通過することはありません。このアプローチに何か問題があるのか​​ 、それともこのニーズを処理するためのより安全な方法があるのか​​ 疑問に思っていますか? 答えが URL のなりすましである場合、その方法でリクエストを調べるとバ​​ックドアが開かれる可能性があります。それを特定しようとしています。これを実装した方法がこのニーズを解決する正しい方法ではない場合、他の方法を脆弱性にさらしたくないだけです。

4

1 に答える 1

1

HttpMessageHandler の使用は正しくありません。Web API が ASP.NET でホストされている場合、ハンドラーはクライアントのみを認証し、現在のプリンシパルを Thread.CurrentPrincipal に設定し、必要に応じて HttpContext.Current.User に設定する必要があります。次に、フレームワークは、[AuthorizeAttribute] 属性や [AllowAnonymous] 属性など、アクションの承認規則を定義するために使用できる属性を提供します。これらの属性は、現在のプリンシパルに依存して承認を実行します。

public class HelloWorldController : ApiController
    {
        [Authorize]
        public string Get()
        {
            return "hello " + User.Identity.Name;
        }
    }

    public class HelloWorldAnonymousController : ApiController
    {
        [AllowAnonymous]
        public string Get()
        {
            return "hello anonymous";
        }
    }

Authorize は、アクションが認証されたユーザーを必要とすることを指定します。AllowAnonymous では、認証されたユーザーは必要ありません。あなたの質問については、認証を必要としないアクションを実行しても問題はありません。

于 2013-03-27T20:04:09.980 に答える