我正在尝试使用依赖注入通过应用程序共享安全对象:
services.AddScoped<IRequesterFilter, RequesterFilter>();
验证令牌时填充对象:
app.UseJwtBearerAuthentication(options =>
{
options.AutomaticAuthenticate = true;
options.Authority = "https://xxxxxx.xxx";
options.TokenValidationParameters.ValidateAudience = false;
options.TokenValidationParameters.ValidIssuer = "https://yyyyyy.yyyy";
options.Events = new JwtBearerEvents
{
OnValidatedToken = context =>
{
var requestFilter = context.HttpContext.ApplicationServices.GetService<IRequesterFilter>();
requestFilter.RequesterLevel = RequesterLevelEnum.Client;
requestFilter.AppId = context.AuthenticationTicket.Principal.FindFirst("appid").Value;
return Task.FromResult(0);
}
};
});
但是当我从控制器构造函数中获取IRequesterFilter时,该对象未初始化:
public ValuesController(IRequesterFilter requestFilter)
{
var x = requestFilter;
}
我正在使用ASP.NET Core 1.0 RC1。
答案 0 :(得分:3)
您使用的是错误的容器。
您正在使用context.HttpContext.ApplicationServices.GetService<IRequesterFilter>()
,它适用于应用程序管理/应用程序范围的对象,通常是单例。
对于作用域服务,您必须使用作用域容器(称为RequestServices
),这将是context.HttpContext.RequestServices.GetService<IRequesterFilter>()
。
请注意,使用ASP.NET Core RC2将从HttpContext 删除ApplicationServices
,这将是目前使用它的方式的重大变化。