ほとんどのAPIでは、次のように認証を行うだけです。
[Authorize(Policy = "Foo")]
public MyApi()
私はこのポリシーをNuGetから取得していますが、変更できません。
一部のAPIでは、このポリシーが常に必要なわけではありません。これは、いくつかの構成に基づいて実行時に理解する必要があります。これをインラインで実行し、セットアップされているすべてのハンドラーが実行されるようにする方法を教えてください。
何度も検索した後、を作成しIAuthorizationService
、それを使用してを呼び出すことがわかりましたAuthorizeAsync
。これは私が望んでいるようですが、今実行している問題は、すべてのハンドラーAuthorizationFilterContext
がコンテキスト上のリソースとしてに依存していることです。これは、AuthorizationAsyncの呼び出しではなく、属性を介してAuthorizationが行われたときに自動的に行われるようです。この場合、手動で渡す必要があります。私のコードは今このようになります:
public MyApi()
{
var allowed = await _authorizationService.AuthorizeAsync(User, null, "Foo").ConfigureAwait(false);
}
これは私のすべてのハンドラを正しく通過するようですが、がないために機能しませんAuthorizationFilterContext
。
1)これはそもそも正しいアプローチですか、またはこれをインラインで実行する他の方法がありますか?これをラップする独自のポリシーを作成する方法がおそらくあり、そこで構成を確認できると思いますが、単純なインラインアプローチがある場合は、それを優先します。
2)この方法が有効である場合、AuthorizationFilterContext
?手動で作成してみましたが、コンテキストからより多くのデータを渡さないと、これは実際には正しくないようですが、良い例やドキュメントが見つかりません。
new AuthorizationFilterContext(new ActionContext(HttpContext, HttpContext.GetRouteData(), new ActionDescriptor()), new IFilterMetadata[] { });