因此,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身份验证服务器进行身份验证。
答案 0 :(得分:0)
您可以将服务或DTO注入ResourceOwnerPasswordValidator
构造函数:
public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator
{
public ResourceOwnerPasswordValidator(IAuthRepository repository)
{
}
}
因此可以传递返回连接字符串的服务。
默认情况下,验证器的实现registered为Transient
,这意味着它在单例中解析之前不会是单例(我猜不是IdSrv4情况)。
如果您需要Scoped
连接字符串(即每个网络请求),请使用工厂方法注册范围内的DTO:services.AddScoped<T>(() => )
或使用AsyncLocal<T>
。检查此主题以获取更多详细信息: