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框架! –