1

在 ASP.NET Core Web api 项目中,我使用的是 Simple Injector 和 JwtBearer 令牌。我已经定义了我的自定义令牌事件处理程序类并将其绑定到 ASP.NET Core 机制,如下所示:

private void ConfigureSecurity(IServiceCollection services)
{
    var encodedKey = Encoding.UTF8.GetBytes(_config[Konstants.SecretKey]);
    var key = new SymmetricSecurityKey(encodedKey);

    services.AddTransient<TokenAuthenticationEvents>();
    var authentication = services.AddAuthentication(o =>
    {
        o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        o.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
        o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    });

    authentication.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
    {
        options.SaveToken = true;
        options.EventsType = typeof(TokenAuthenticationEvents);
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = true,
            ValidAudience = _config[Konstants.AudienceKey],
            ValidateIssuer = true,
            ValidIssuer = _config[Konstants.AuthorityKey],
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = key,
            RequireExpirationTime = true,
            ValidateLifetime = true,
        };
    });
}

这是我的班级令牌事件:

public class TokenAuthenticationEvents : JwtBearerEvents
{
    private readonly ILogger _log;
    private readonly IUserManager _users;


    public TokenAuthenticationEvents(ILogger log)
    {
        _log = log ?? throw new ArgumentNullException(nameof(log));
        _users = null;
    }

    public override Task TokenValidated(TokenValidatedContext context)
    {
        //Some Custom Logic that requires IUserManager 

        return base.TokenValidated(context);
    }
}

我使用 Simple Injector 作为我的 DI 容器

services.AddSimpleInjector(container, options =>
{
    options
        .AddAspNetCore()
        .AddControllerActivation()
        .AddViewComponentActivation()
        .AddPageModelActivation()
        .AddTagHelperActivation();
    });
    services.EnableSimpleInjectorCrossWiring(container);
    services.UseSimpleInjectorAspNetRequestScoping(container);

IUserManager连同它的所有依赖项都在 Simple Injector 中注册。如果我尝试传入一个异常IUserManagerTokenAuthenticationEvents则会引发 ASP.NET Core 无法解析IUserManager。所以我的问题是

如何告诉 ASP.NET Core DIIUserManager从 Simple Injector 获得解决方案?.

4

2 回答 2

3

就像 Simple Injector跨线ASP.NET Core 组件一样,您可以反过来做同样的事情,尽管您必须手动执行此操作。例如:

services.AddScoped<IUserManager>(c => container.GetInstance<IUserManager>());
于 2019-07-10T09:01:08.133 回答
1

这个答案并不能解决您最初的问题,但我确实注意到您将旧的 Simple Injector ASP.NET Core 配置模型与新的配置模型混合在一起。您目前有以下代码:

    services.AddSimpleInjector(container, options =>
    {
        options
            .AddAspNetCore()
                .AddControllerActivation()
                .AddViewComponentActivation()
                .AddPageModelActivation()
                .AddTagHelperActivation();
        });

        services.EnableSimpleInjectorCrossWiring(container);
        services.UseSimpleInjectorAspNetRequestScoping(container);

EnableSimpleInjectorCrossWiring但是,对和的调用UseSimpleInjectorAspNetRequestScoping是旧 API,将在未来版本中删除。当您调用时,这些功能会自动启用.AddAspNetCore()。因此,您可以将配置减少到以下内容:

    services.AddSimpleInjector(container, options =>
    {
        options
            .AddAspNetCore()
                .AddControllerActivation()
                .AddViewComponentActivation()
                .AddPageModelActivation()
                .AddTagHelperActivation();
        });
于 2019-07-10T09:04:58.037 回答