Я выполнил заказ CredentialsAuthProvider
для моей аутентификации и использовал его со стандартным хранилищем сеансов памяти.Как использовать мой собственный поставщик проверки подлинности ServiceStack с помощью Redis?
Теперь я попытался изменить память сеанса Redis и добавил это к моему Configure()
метода в AppHost
:
container.Register<IRedisClientsManager>(c =>
new PooledRedisClientManager("localhost:6379"));
container.Register<ICacheClient>(c => (ICacheClient)c
.Resolve<IRedisClientsManager>()
.GetCacheClient()).ReusedWithin(Funq.ReuseScope.None);
Теперь, когда я аутентифицировать, я могу видеть, что ключ с urn:iauthsession:...
добавляется к моему Redis сервер. Но все маршруты с атрибутом [Authenticate]
дают ошибку 401 Unauthorized
.
The CustomCredentialsAuthProvider
реализован так:
public class CustomCredentialsAuthProvider : CredentialsAuthProvider
{
public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
{
if (userName != string.Empty && password != string.Empty)
{
// Database call ...
var session = (CustomSession)authService.GetSession();
session.ClientId = login.ClientId;
// Fill session...
authService.SaveSession(session, SessionExpiry);
return true;
}
return false;
}
}
ServiceStack Версия: 3.9.71
EDIT:
Я попытался переопределить CredentialsAuthProvider
IsAuthorized
метод, но без успеха.
Но я наследую свой объект сеанса от AuthUserSession
, который также имеет метод IsAuthorized
. Когда я возвращаю true из этого метода, сеанс Redis работает с атрибутом Authenticate
.
public class CustomSession : AuthUserSession
{
public int ClientId { get; set; }
...
public override bool IsAuthorized(string provider)
{
return true;
}
}
Я не думаю, что это связано с вашей проблемы, но вы не должны заполнять сессию в ' TryAuthenticate'. Предпочтительная практика - в методе «OnAuthenticated». [См. Здесь] (https://github.com/ServiceStackV3/ServiceStackV3/wiki/Authentication-and-authorization).Кажется, что существует проблема с возвратом сеанса из Redis в 'AuthenticationAttribute'. Чтобы отладить это, я бы начал с удаления атрибута из одного из ваших обработчиков действий и попробуйте добавить в него 'base.Request.GetSession()' и посмотреть, правильно ли восстановлен ваш сеанс в вашей службе. – Scott
@Scott Я могу получить сеанс в обработчике действий, когда я удаляю атрибут '[Authenticate]'. Так кажется, что это ошибка в 'AuthenticationAttribute'? –
Это не ошибка в вашей реализации. Я думаю, вам нужно установить 'session.UserAuthName' и' session.UserAuthId', если вы не переопределяете метод 'CredentialProviders'' IsAuthorized'. – Scott