2016-02-16 6 views
1

В моем приложении 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 и хотел бы реализовать лучшие практики.

ответ

2

Там уже возможность ограничить доступ к пользователям, прошедшим проверку только с:

Plugins.Add(new ServerEventsFeature { 
    LimitToAuthenticatedUsers = true 
}); 
+0

Это работало, хотя я должен был удалить Start() вызов от клиента и вызвать Connect() только после того, как Authenticate. Это правильный ответ. Хотелось бы также узнать, как переопределить имена пользователей, но это тема для отдельного вопроса, который я считаю – HardLuck

Смежные вопросы