Asp.net core 如何访问.NET Core 2.0 ConfigureServices()中的依赖项注入图
我正在尝试从.NETCore1.1迁移到2.0,但在迁移JWT令牌配置时遇到了困难。我有一个提供JWTBeareOptions的接口/类,在.NET Core 2.0中,我无法访问我的DI图形对象(因为在2.0中,JWT是在ConfigureServices()函数中配置的)。我想保持Startup.cs文件中没有那么多配置JWT的代码行 有没有办法将JWTBeareOptions对象创建委托给通过DI创建的提供者?我想要像下面这样的东西:Asp.net core 如何访问.NET Core 2.0 ConfigureServices()中的依赖项注入图,asp.net-core,asp.net-core-mvc,asp.net-core-2.0,asp.net-core-webapi,Asp.net Core,Asp.net Core Mvc,Asp.net Core 2.0,Asp.net Core Webapi,我正在尝试从.NETCore1.1迁移到2.0,但在迁移JWT令牌配置时遇到了困难。我有一个提供JWTBeareOptions的接口/类,在.NET Core 2.0中,我无法访问我的DI图形对象(因为在2.0中,JWT是在ConfigureServices()函数中配置的)。我想保持Startup.cs文件中没有那么多配置JWT的代码行 有没有办法将JWTBeareOptions对象创建委托给通过DI创建的提供者?我想要像下面这样的东西: public virtual void Configu
public virtual void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication()
.AddJwtBearer(MyAuthicationScheme.JwtAuthName, options =>
{
myInjectedInstance.SetJwtBearOptions(options, Configuration);
})
}
在微软的文档中找到了答案。在ConfigureServices调用期间无法访问DI对象:在microsoft的文档中找到了答案。在ConfigureServices调用期间无法访问DI对象:@flodin 对于AddJwtBearer,我遇到了同样的问题,通过插入OnMessageRecieved事件,有一种很难访问HttpContext的方法
jwt.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents()
{
OnMessageReceived = context =>
{
// setting the issuer validator delegate here instead of in the jwt.TokenValidationParameters
// allows for accessing the HttpContext items and DI container
context.Options.TokenValidationParameters.IssuerValidator = (issuer, token, parameters) =>
{
// di in callbacks!
var test = context.HttpContext.RequestServices.GetService<ITenant>();
return Task.CompletedTask;
}
jwt.Events=new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents()
{
OnMessageReceived=上下文=>
{
//在此处而不是在jwt.TokenValidationParameters中设置颁发者验证程序委托
//允许访问HttpContext项和DI容器
context.Options.TokenValidationParameters.IssuerValidator=(发卡机构、令牌、参数)=>
{
//回拨中的di!
var test=context.HttpContext.RequestServices.GetService();
返回Task.CompletedTask;
}
@flodin
对于AddJwtBearer,我遇到了同样的问题,通过插入OnMessageRecieved事件,有一种很难访问HttpContext的方法
jwt.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents()
{
OnMessageReceived = context =>
{
// setting the issuer validator delegate here instead of in the jwt.TokenValidationParameters
// allows for accessing the HttpContext items and DI container
context.Options.TokenValidationParameters.IssuerValidator = (issuer, token, parameters) =>
{
// di in callbacks!
var test = context.HttpContext.RequestServices.GetService<ITenant>();
return Task.CompletedTask;
}
jwt.Events=new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents()
{
OnMessageReceived=上下文=>
{
//在此处而不是在jwt.TokenValidationParameters中设置颁发者验证程序委托
//允许访问HttpContext项和DI容器
context.Options.TokenValidationParameters.IssuerValidator=(发卡机构、令牌、参数)=>
{
//回拨中的di!
var test=context.HttpContext.RequestServices.GetService();
返回Task.CompletedTask;
}
您的意思是仅仅创建一个扩展方法吗?e.x.是否可以注入自定义服务的构造函数?您的意思是仅仅创建一个扩展方法吗?e.x.是否可以注入自定义服务的构造函数?我认为这只是部分正确。由于DI图是在ConfigureServices中初始化的,因此这是合乎逻辑的无法在那里访问它。但是,那里的许多配置调用都会使用可能是lambda函数的回调。这些回调通常会在DI图完成后依次调用。在许多情况下,您可以使用IServiceProvider作为这些回调的参数。在某些情况下,例如AddJwtBearer(),您不能。这对我来说是一个严重的问题。我认为这只是部分正确。由于DI图正在ConfigureServices中初始化,因此在那里无法访问它是合乎逻辑的。但是,那里的许多配置调用都会进行回调,可能是lambda函数。这些回调通常会在DI图被调用后依次调用pleted。在许多情况下,您可以将IServiceProvider作为这些回调的参数。在某些情况下,例如AddJwtBearer(),您不能。这对我来说是一个严重的问题。