IdentityServer4和ResourceOwnerPasswordValidator动态ConnectionString

时间:2017-07-07 21:27:25

标签: authentication asp.net-core identityserver4

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

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

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

如果我可以将参数传递给ResourceOwnerPasswordValidator类的构造函数,如下所示,那么这样就可以了,但ASP.NET CORE无法做到这一点。

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

这不起作用,因为ConfigurationService在没有传递值的情况下注册此类。这是有道理的,因为此注册过程在构建管道之前开始。如何动态地将连接字符串传递给ResourceOwnerPasswordValidator类?我正在尝试对打电话的门户进行身份验证。在ID3中,我可以使用acr_value来完成此操作。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

如果您需要Scoped连接字符串(即每个网络请求),请使用工厂方法注册范围内的DTO:services.AddScoped<T>(() => )或使用AsyncLocal<T>。检查此主题以获取更多详细信息:

How to Per-Request caching in ASP.net core