2016-11-11 28 views
1

は、サービスを構成するために、私のスタートアップコードです:.NET Core MVCでは、AuthorizationHandler内でDbContextにアクセスするにはどうすればよいですか?ここ

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 

    services.AddDbContext<ThisApplicationDbContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

    services.AddAuthentication(
     SharedOptions => SharedOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme); 

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

そしてここでは、ユーザーを認証するためのクラスです:

public class ValidUserAuthorization : AuthorizationHandler<ValidUserAuthorization>, IAuthorizationRequirement 
{ 
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ValidUserAuthorization requirement) 
    { 
     string username = context.User.Identity.Name; 

     if (context.User.Identity.Name == "hardcoded-username") 
     { 
      context.Succeed(requirement); 
     } 
     return Task.CompletedTask; 
    } 
} 

私が見ることができるように私の承認クラス(ValidUserAuthorization)を変更したいですハードコードされた文字列と比較するのではなく、私のアプリケーションデータベース(ThisApplicationDbContextを介してアクセスされる)のユーザー名をアップしてください。

(既にConfigureServicesで初期化されている)このデータベースコンテキストを取得し、認可クラスで使用する最良の方法は何ですか?

答えて

0
それを行うための1つの可能な方法は、一般的なタイプとしてあなたDbContextの種類を渡すことである

public class ValidUserAuthorization<TDbContext> : AuthorizationHandler<ValidUserAuthorization>, IAuthorizationRequirement 
    where TDbContext : DbContext, new() 
{ 
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ValidUserAuthorization requirement) 
    { 
     using (TDbContext db = new TDbContext()) 
     { 
      // ... 
     } 
    } 
} 

は、その後、あなたのConfigureServices方法でこのようなValidUserAuthorizationオブジェクトを作成することができます。

policy.Requirements.Add(new ValidUserAuthorization<ThisApplicationDbContext>()); 
+0

ご回答有難うございます!私はこの方法が本当に好きです。あなたの答えを読んで、コンストラクタにパラメータとして渡すこともできることに気付きました。私はどちらがよりよい練習になるかわからない - あなたはどう思いますか? –

+0

それも動作しますが、コンストラクタを呼び出すためにリフレクションが必要になります。これは完全に機能しますが、実行するのに少し時間がかかります。私のプロジェクトでは、可能な限りジェネリック型を使用しようとしましたが、そうでない場合は、両方のメソッドがうまくいくので、あなたが好きなように行くことができます。 – Vyrira

+0

興味深い、その反射の側面については知りませんでした - ありがとう。私はインスタンス化されたThisApplicationDbContextオブジェクトが認可ハンドラに供給されるのを見つけることができなかったので、とにかく他の方法を見つけようとする必要があります。このMVCフレームワークはまったく新しいものです! –

関連する問題