The problem:
It is not obvious how to correctly authenticate with:
when using the ServiceStack.Redis solution.
According to the docs a proper way to provide a password for redis/sentinel is to set it via URLs in the following manner:
var sentinel = new RedisSentinel(new[] {"password@localhost:26381"})
This works fine, but how do I provide a password for the redis connections themselves? The password I've specified in the URL will not be copied over to redis connections.
I've found a workaround, that seems to be working, but I'm not sure if it will actually cover all the possible cases:
//Get the original factory
var clientFactory = RedisConfig.ClientFactory;
//Decorate it with the logic that sets a password.
RedisConfig.ClientFactory = c =>
{
c.Password = "password";
return clientFactory.Invoke(c);
};
//Continue to initialize sentinels
var sentinel = new RedisSentinel(new[] {"password@localhost:26379"});
It seems like this will actually fix the problem and will provide a password to the connections to redis instances (not sentinels).
The question is: is this the recommended way of doing it? Or is there a better approach?
You can use a RedisSentinel HostFilter to customize the connection string for the individual hosts the sentinel connects to, e.g:
sentinel.HostFilter = host => $"password@{host}";