【问题标题】:multiple configuration databases for IdentityServer4IdentityServer4 的多个配置数据库
【发布时间】:2021-02-25 00:39:23
【问题描述】:

我正在使用具有多个数据库的 identityServer4。到目前为止,我可以将多个数据库与用户存储一起使用。我将其解决为中间件的以下代码:

    public async Task Invoke(HttpContext context)
  {
     var req = context.Request;

     if (req.Path == "/Account/Login" && req.Method.Equals("POST"))
     {
        if (req.Form.Keys.Contains("Input.Database") == false)
        {
           throw new InvalidOperationException("No database key was sent with this request: " + req.Path);
        }
        var lDatabasKey = req.Form["Input.Database"];
        _configuration["ConnectionStrings:default"] = _configuration[$"ConnectionStrings:{lDatabasKey}"];

     }

配置对象得到更新,所以值 ConnectionString:default 用我需要使用的连接字符串更新。

不幸的是,这个概念在 Startup.cs 的 ConfigureServices 中安装的配置数据库不起作用:

  string connectionString = Configuration.GetConnectionString("default");
  services.AddIdentity<ApplicationUser, IdentityRole>(options =>
     {
        options.SignIn.RequireConfirmedEmail = false;
     })
     .AddEntityFrameworkStores<IdentityUserDbContext>()
     .AddDefaultTokenProviders().AddClaimsPrincipalFactory<CentralHubClaimsPrincipalFactory>();


     var builder = services.AddIdentityServer(options =>
     {
        options.Events.RaiseErrorEvents = true;
        options.Events.RaiseInformationEvents = true;
        options.Events.RaiseFailureEvents = true;
        options.Events.RaiseSuccessEvents = true;
        options.UserInteraction.LoginUrl = "/Account/Login";
        options.UserInteraction.LogoutUrl = "/Account/Logout";


        options.Authentication = new AuthenticationOptions()
        {
           CookieLifetime = TimeSpan.FromHours(10), // ID server cookie timeout set to 10 hours
           CookieSlidingExpiration = true

        };
     })
     .AddConfigurationStore(options =>
     {
        options.ConfigureDbContext = b => b.UseSqlServer(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly));
     })
     .AddOperationalStore(options =>
     {
        options.ConfigureDbContext = b => b.UseSqlServer(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly));

     }).AddAspNetIdentity<ApplicationUser>()
     .AddProfileService<AspNetIdentityProfileService>();

使用断点我可以看到中间件中的 connectionString:default 具有我要使用的数据库的正确值。但它仍然使用在startup.cs中之前方法中保存的默认connectionString。

那么身份服务器可以使用多个配置数据库吗?

【问题讨论】:

    标签: identityserver4


    【解决方案1】:

    一种选择是为 IdentityServer 创建您自己的 EntityFramework 配置后端,方法是获取现有源代码并破解所做的查询。 然后使用 clientID 前缀作为“数据库”标识符/选择器,例如

    A0000-A9999 -> 转到数据库 A B0000-B9999 -> 转到数据库 B C0000-C9999 -> 进入数据库 C

    或使用如下客户端 ID: AAA:XXX 其中 AAA 是客户端/数据库标识符,XXX 是该数据库中的客户端。

    选择要使用的数据库/连接字符串。 “愚弄” IdentityServer 相信只有一个“数据库”。

    拥有结构化的 clientID 还可以更轻松地调试和推理系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多