1

クラスを使用してIAuthorizationFilterすべての要求をフィルター処理し、認証 Cookie にカスタム ユーザー クレームがまだ存在する (マルチテナント アプリ) かどうかを確認します。これらの情報は、アプリケーションの残りの部分に不可欠です。これらの情報が存在しない場合は、ログイン ページにリダイレクトされます。

    public class TokenAuthorizationFilter : IAuthorizationFilter, IAsyncAuthorizationFilter
    {

        public TokenAuthorizationFilter()
        {
            // Some dependency injection ...
        }

        public void OnAuthorization(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context)
        {
            CheckToken(context);
        }

        public Task OnAuthorizationAsync(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context)
        {
            return CheckToken(context);
        }
}

そして、このようにフィルターを登録します

    services.AddMvc(config =>
    {
        config.Filters.Add(typeof(TokenAuthorizationFilter));
    });

そして、私がアクセスしたいコントローラのアクションは非常に単純です:

[Authorize(Policy = "TokenValid")]
public class HomeController : AjaxBaseController
{
    public IActionResult Index()
    {
        return View();
    }
}

のポリシーにも達していませんAuthorizeAttribute。スタック トレースでわかるように、Identity はMicrosoft.AspNet.Identity.SignInManagerをチェックした後、ミドルウェアのどこかにを作成しようCookieAuthenticationOptionsとしています。私たちのアプリケーションではログインは非常に特殊なので、Identity がユーザーを自動的にログに記録することは望ましくありません。認証 Cookie の有効期限が切れたときに、この問題を再現できます。何か案は ?ありがとう !

4

2 に答える 2

4

また、承認フィルターをTokenAuthorizationFilter継承する必要があり、名前を に変更します。これは、次のように呼び出すことができる属性になります。AuthorizeAttributeTokenAuthorizationFilterAttribute[TokenAuthorizationFilter]

[TokenAuthorizationFilter]
public class HomeController : AjaxBaseController
{
    public IActionResult Index()
    {
        return View();
    }
}

この場合、ASP.NET Core は非同期メソッドのみを呼び出すため、IAuthorizationFilter と IAsyncAuthorizationFilter の両方を実装する場合は注意してください。非同期呼び出しが必要ない場合は、IAuthorizationFilter インターフェイスのみを実装してください。

また、次のようにフィルターを登録し続けると:

services.AddMvc(config =>
{
    config.Filters.Add(typeof(TokenAuthorizationFilter));
});

毎回強制的に認証フィルターが呼び出されるため、すべてのアクションに対してフィルターが呼び出されることがわかります。この場合、アクションの上に属性を追加する必要はありません。

于 2016-07-06T15:29:14.747 に答える