2016-04-22 10 views
0

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が期限切れになったときにこの問題を再現できます。 アイデアありがとう!

答えて

0

最後に、私は問題を発見しました。 30分ごとに、IdentityはSecurityStamp検証を通じてユーザーを検証しようとしています。これは、検証時に存在しないデータベース接続が必要であったため、アプリケーションがクラッシュする原因になります。私たちは、OnValidatePrincipalを再実装することにより、私たちのスタートアップで、この検証desactiveました:

から継承し、私が読んだ
options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents { OnValidatePrincipal = (context) => Task.FromResult(0) }; 
1

また、TokenAuthorizationFilterを承認フィルタとしてAuthorizeAttributeから継承させ、TokenAuthorizationFilterAttributeという名前にする必要があります。これは、あなたが[TokenAuthorizationFilter]で呼び出すことができます属性になります :あなたが行う場合:IAuthorizationFilterとIAsyncAuthorizationFilterの両方を実装する際にASP.NETコアはこの場合のみ非同期メソッドを呼び出しますよう

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

は、注意してください非同期呼び出しを必要とせず、IAuthorizationFilterインターフェイスのみを実装します。また

、あなたがこのようなフィルタを登録するに保つ場合:

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

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

+0

'AuthorizeAttribute'は良い解決策、そのためのより良い使用ポリシーではありません。 –

+0

同意しましたが、この場合はIAuthorizationFilterは必要ありません。Startup.csクラスでサービスを設定する際にカスタム(または非)要件のポリシーを追加するだけです。services.AddAuthorization(options => options.AddPolicy "PolicyName"、policy => {ここにあなたの要件を追加})) ' –

+0

はい、そうです。私たちはトークンの検証を 'IAuthorizationFilter'から' CookieAuthenticationEvents'に移しました。ご協力ありがとうございます! –

関連する問題