【发布时间】:2020-05-03 21:23:15
【问题描述】:
我即将将 ASP.NET Core MVC Web 应用程序从 1.1 迁移到 2.0。该应用使用 AzureAd 进行身份管理。
在 1.1 中,我在 Startup.cs(Configure())中处理了 openidconnect 事件(如 OnTokenReceiver、OnAuthorizationCodeReceived、OnRemoteFailure 等),我可以在其中使用依赖注入。我已经注入了很多服务,比如 EF db 上下文,并在事件处理程序中使用了它们。
升级到 2.0 后,我不得不将整个身份验证迁移到 AzureAdAuthenticationBuilderExtensions 的 ConfigureAzureOptions 类(实现 IConfigureNamedOptions<OpenIdConnectOptions> 接口),其中(如我所见)DI 不能使用。
所以现在只有这个在 Startup 的 ConfigureServices 中:
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddAzureAd(options => Configuration.Bind("AzureAd", options))
.AddCookie();
有人知道如何在 openidconnect 事件中使用服务?
更新:我能够在@Balah 的回答的帮助下解决这个问题。基本上解决方案是使用通用的.AddOpenIdConnect(),而不是创建一个名为.AddAzureAd()的扩展。
对答案的一个小补充:由于身份验证部分已从 Configure() 移动到 ConfigureServices() 未启用 DI 且尚未注册服务,因此获取这些服务的方法毕竟是这样的:
var scopeFactory = services
.BuildServiceProvider()
.GetRequiredService<IServiceScopeFactory>();
var scope = scopeFactory.CreateScope();
var provider = scope.ServiceProvider;
var dbContext = provider.GetRequiredService<ApplicationDbContext>();
var graphSdkHelper = provider.GetRequiredService<IGraphSDKHelper>();
var memoryCache = provider.GetRequiredService<IMemoryCache>();
...
请记住,您必须在此代码上方添加这些服务!
【问题讨论】:
标签: c# asp.net-core entity-framework-core asp.net-core-2.0