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
で初期化されている)このデータベースコンテキストを取得し、認可クラスで使用する最良の方法は何ですか?
ご回答有難うございます!私はこの方法が本当に好きです。あなたの答えを読んで、コンストラクタにパラメータとして渡すこともできることに気付きました。私はどちらがよりよい練習になるかわからない - あなたはどう思いますか? –
それも動作しますが、コンストラクタを呼び出すためにリフレクションが必要になります。これは完全に機能しますが、実行するのに少し時間がかかります。私のプロジェクトでは、可能な限りジェネリック型を使用しようとしましたが、そうでない場合は、両方のメソッドがうまくいくので、あなたが好きなように行くことができます。 – Vyrira
興味深い、その反射の側面については知りませんでした - ありがとう。私はインスタンス化されたThisApplicationDbContextオブジェクトが認可ハンドラに供給されるのを見つけることができなかったので、とにかく他の方法を見つけようとする必要があります。このMVCフレームワークはまったく新しいものです! –