1

ID認証に基づいてマルチテナントアプリケーションを開発します。各ユーザーは、データベースに格納されたトークンセッションを取得して、ユーザーがまだ接続されているかどうかを確認します(有効期限があります)。私はユーザーClaimにトークン(およびユーザー会社に関する他の情報)を保存します。そのアイデンティティがユーザーがまだ接続されていることを検出した後、ユーザートークンがデータベース内でまだ有効かどうかを確認する必要があります(ただし、彼が接続している場合のみ)。AuthorizationHandlerを実装しました。AuthorizationHandlerとデータベース依存性注入

public TokenValidHandler(MyDatabaseService service) 
{ 
    // No information about the user connection string 
} 

protected override async void Handle(AuthorizationContext context, TokenValidRequirement requirement) 
{ 
    // Check the token in database 
} 

そして、私はこのように私のハンドラを登録します。我々は、マルチテナントアプリケーションを持っているので、ユーザーがアプリケーションを終了し、サイトを再開いたとき

services.AddAuthorization(options => 
{ 
    options.AddPolicy("TokenValid",policy => policy.Requirements.Add(new TokenValidRequirement())); 
}); 

services.AddSingleton<IAuthorizationHandler, TokenValidHandler>(); 

、彼の接続文字列が失われました(私たちはデータベース文字列を保持したくないので)、Claimに格納された情報を使用してデータベースアクセスを回復します。認証が期限切れになった場合、Claimに情報がありませんので、自分のデータベースにアクセスできません。

私が見る通り、TokenValidHandlerは接続されていなくてもインスタンス化されていますが、それは正常ですか?私のデータベースサービスに依存性注入を使用したいのであれば、ユーザーデータベースアクセスに関する情報がここにないため、私はできません。それについてのアイデア?

+0

IServiceProviderを使用するソリューションが見つかったので、私のデータベースサービスをHandlerメソッドに入れました。依存性インジェクションではなく、クリーンソリューションではありません。 –

答えて

2

ハンドラをスコープとして登録してみてください。リクエストごとに新しいインスタンスが得られます。これはおそらく必要なものです。

+0

はい、それは正しいソリューションです。 –

+0

これは本当ですが、スコープで登録された5000個のハンドラがある場合、どのアクションを相互作用するときにいつすべてのインスタンスがインスタンス化されるのでしょうか?彼らは注入すべき他のサービスに依存する可能性があります。 –