【问题标题】:Add Authentication inside AutoFac ConfigureTenant在 AutoFac ConfigureTenant 中添加身份验证
【发布时间】:2021-10-07 12:56:18
【问题描述】:

我想在 .NET Core 应用程序上进行基于租户的身份验证。我正在使用 AutoFac 构建基于租户的容器。

我能够创建ServiceCollectionPopulate 身份验证服务。但是,身份验证失败并为租户获得未经授权的响应。

public static MultitenantContainer ConfigureMultitenantContainer(IContainer container)
{
    multitenantContainer.ConfigureTenant("80fdb3c0-5888-4295-bf40-ebee0e3cd8f3", containerBuilder =>
    {
        containerBuilder.RegisterType<DataService>().As<IDataService>().InstancePerDependency();
        containerBuilder.RegisterInstance(new OperationIdService()).SingleInstance();

        ServiceCollection tenantServices = new();
        tenantServices.AddAuthentication(opt =>
        {
            opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        }).AddJwtBearer(options =>
        {
            options.Authority = "https://key-cloak.cloudapp.azure.com:8443/auth/realms/test";
            options.Audience = "test";
        });
        containerBuilder.Populate(tenantServices);
    });
    
    return multitenantContainer;
}

【问题讨论】:

  • 您是否深入了解了 ASP.NET 方面的情况,例如,它是否只解析一次身份验证设置并进行缓存(因此您不会获得每个租户的信息)?可能不仅仅是您的 DI 设置导致不匹配。
  • 也可能相关 - Populate doesn't just convert registrations, it also sets up some default things 用于与 Microsoft.Extensions.DependencyInjection 交互。您是否尝试过使用 Autofac 手动注册身份验证内容而不使用 Populate

标签: asp.net-core autofac


【解决方案1】:

在这篇文章的帮助下,我自己解决了这个问题。

MultiTenant Authentication by Michael McKenna

默认情况下,处理程序不使用默认的“.UseAuthentication”中间件注册。在您拥有有效的租户上下文之前,这些方案已在中间件构造函数中注册。由于它不支持动态注册方案 OOTB,我们需要对其稍作修改。

我们将采用现有的AuthenticationMiddleware.cs,并将IAuthenticationSchemeProvider 注入点从构造函数移动到 Invoke 方法。由于在我们注册了租户服务后调用了 invoke 方法,因此它现在可以使用所有特定于租户的身份验证服务。

【讨论】:

    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多