IAuthorizationFilter
クラスを使用してすべての要求をフィルタリングし、カスタムCookieが認証Cookieにまだ存在するかどうかを確認します(マルチテナントアプリケーション)。これらの情報は、アプリケーションの残りの部分で不可欠です。これらの情報がない場合は、ログインページにリダイレクトされます。IAuthorizationFilterが毎回呼び出されない
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
のポリシーに達していません。 stacktraceで見ることができるように、IdentityはCookieAuthenticationOptions
を確認した後、ミドルウェアのどこかにMicrosoft.AspNet.Identity.SignInManager
を作成しようとしていますが、私は彼がユーザーに再ログインしようとしていると思っていましたが、ログインはアプリケーションでは非常に特殊なので、アイデンティティに自動的にユーザーをログさせることは望ましくありません。認証Cookieが期限切れになったときにこの問題を再現できます。 アイデアありがとう!
'AuthorizeAttribute'は良い解決策、そのためのより良い使用ポリシーではありません。 –
同意しましたが、この場合はIAuthorizationFilterは必要ありません。Startup.csクラスでサービスを設定する際にカスタム(または非)要件のポリシーを追加するだけです。services.AddAuthorization(options => options.AddPolicy "PolicyName"、policy => {ここにあなたの要件を追加})) ' –
はい、そうです。私たちはトークンの検証を 'IAuthorizationFilter'から' CookieAuthenticationEvents'に移しました。ご協力ありがとうございます! –