解决对令牌验证和控制器构造函数的依赖性

时间:2016-05-11 03:42:43

标签: asp.net-core asp.net-core-mvc

我正在尝试使用依赖注入通过应用程序共享安全对象:

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。

1 个答案:

答案 0 :(得分:3)

您使用的是错误的容器。

您正在使用context.HttpContext.ApplicationServices.GetService<IRequesterFilter>(),它适用于应用程序管理/应用程序范围的对象,通常是单例。

对于作用域服务,您必须使用作用域容器(称为RequestServices),这将是context.HttpContext.RequestServices.GetService<IRequesterFilter>()

请注意,使用ASP.NET Core RC2将从HttpContext 删除ApplicationServices,这将是目前使用它的方式的重大变化。