【问题标题】:IdentityServer4 and ResourceOwnerPasswordValidator Dynamic ConnectionStringIdentityServer4 和 ResourceOwnerPasswordValidator 动态连接字符串
【发布时间】:2017-07-07 21:27:25
【问题描述】:

因此,IResourceOwnerPasswordValidator 应该替换 IUserService。 在旧版本 IdentityServer3 中,我可以执行以下操作:

factory.UserService = new Registration<IUserService>(typeof(MyIdentityUserService));
factory.Register(new Registration<IUserRepository>(userRepository));

它使用正确的连接字符串传递自定义 userRepository 对象。 现在在 IdentityServer4 中,我需要连接到正确的 Portal 数据库,以便 ID4 针对正确的 Portal 数据库对用户进行身份验证。

如果我可以将参数传递给 ResourceOwnerPasswordValidator 类的构造函数,如下所示,那么这很好,但对于 ASP.NET CORE 是不可能的。

 public ResourceOwnerPasswordValidator(string MyConnString)
        {
            _connstring = MyConnString;
        }

这不起作用,因为 ConfigurationService 注册了此类而无法传递值。这是有道理的,因为此注册过程在管道构建之前开始。如何将连接字符串动态传递给 ResourceOwnerPasswordValidator 类?我正在尝试对发出呼叫的门户进行身份验证。在 ID3 中,我可以通过使用 acr_value 来做到这一点。

我正在尝试让 ID4 作为多租户身份验证服务器进行身份验证。

【问题讨论】:

    标签: authentication asp.net-core identityserver4


    【解决方案1】:

    您可以将服务或 DTO 注入 ResourceOwnerPasswordValidator 构造函数:

    public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator
    {
        public ResourceOwnerPasswordValidator(IAuthRepository repository)
        {
        }
    }
    

    因此可以传递一个返回连接字符串的服务。

    默认情况下,验证器的实现是 registeredTransient,这意味着它不会是单例,直到它被单例解析(我猜这不是 IdSrv4 情况)。

    如果您需要 Scoped 连接字符串(即每个 Web 请求),请使用工厂方法注册一个作用域 DTO:services.AddScoped&lt;T&gt;(() =&gt; ) 或使用 AsyncLocal&lt;T&gt;。检查此线程以获取更多详细信息:

    How to Per-Request caching in ASP.net core

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 2018-09-20
      • 2014-02-05
      • 2014-08-08
      • 1970-01-01
      相关资源
      最近更新 更多