2016-11-11 29 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

這樣做的一種可能的方式是通過你的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框架! –

相關問題