В моем приложении ServiceStack я хочу запретить доступ к каналам для неавторизованных пользователей - поэтому даже событие объединения не будет срабатывать для неавторизованного клиента. Я использую пользовательский поставщик аутентификации, который не взаимодействует с БД и очень минималистичные сейчас (в основном для тестирования)ServiceStack ServerSentEvents ограничивает доступ к каналу
public class RoomsAuthProvider : CredentialsAuthProvider
{
private int userId = 0;
public RoomsAuthProvider(AppSettings appSettings) : base(appSettings)
{
}
public RoomsAuthProvider()
{
}
public override bool TryAuthenticate(IServiceBase authService,
string userName, string password)
{
if (password == "ValidPassword")
{
return true;
}
else
{
return false;
}
}
public override IHttpResult OnAuthenticated(IServiceBase authService,
IAuthSession session, IAuthTokens tokens,
Dictionary<string, string> authInfo)
{
//Fill IAuthSession with data you want to retrieve in the app eg:
session.FirstName = "some_firstname_from_db";
//...
//Call base method to Save Session and fire Auth/Session callbacks:
return base.OnAuthenticated(authService, session, tokens, authInfo);
//session.CreatedAt = DateTime.Now;
//session.DisplayName = "CustomDisplayName" + userId;
//session.IsAuthenticated = true;
//session.UserAuthName = session.UserName;
//session.UserAuthId = userId.ToString();
//Interlocked.Increment(ref userId);
//authService.SaveSession(session, SessionExpiry);
//return null;
}
}
Главных служб часть:
[Authenticate]
public class ServerEventsService : Service
{
...
}
Sidenote - Я попытался переопределяя default DisplayUsername, чтобы не быть username1 ... usernameN, но не повезло. Мой клиент код
var client = new ServerEventsClient("http://localhost:1337/", "home")
{
OnConnect = OnConnect,
OnCommand = HandleIncomingCommand,
OnMessage = HandleIncomingMessage,
OnException = OnException,
OnHeartbeat = OnHeartbeat
}.Start();
client.Connect().Wait();
var authResponse = client.Authenticate(new Authenticate
{
provider = "credentials",
UserName = "[email protected]",
Password = "[email protected]",
RememberMe = true,
});
client.ServiceClient.Post(new PostChatToChannel
{
Channel = "home", // The channel we're listening on
From = client.SubscriptionId, // Populated after Connect()
Message = "Hello, World!",
});
Даже если я пропустить проверку подлинности называют другие клиентами по-прежнему будет получать onJoin команды о не прошедшей проверке подлинности клиента, когда он пытается сделать несанкционированную запись (и получает сообщение об ошибке). Также, когда я намеренно делаю несколько неавторизованных пользователей, счетчик растет - назначенное имя пользователя становится username2, username3 и т. Д. - как я могу отключить неавторизованных пользователей ПОЛНОСТЬЮ? Маркировка моих DTO с помощью Authenticate также ничего не изменила. Любые идеи приветствуются, а также кристаллы, поскольку я новичок в ServiceStack и хотел бы реализовать лучшие практики.
Это работало, хотя я должен был удалить Start() вызов от клиента и вызвать Connect() только после того, как Authenticate. Это правильный ответ. Хотелось бы также узнать, как переопределить имена пользователей, но это тема для отдельного вопроса, который я считаю – HardLuck