Как сделать просмотр только для чтения в SignalR
Я хочу отправлять сообщения только из внутреннего процесса с сервера, а затем исходить к клиентам, и из-за гибкости SignalR я беспокоюсь, что XSS может легко отправить сообщение "myhub.addMessage" и отправить мусор, который я не хочу транслировать. Например, у меня на странице 50 человек, слушающих сообщения из SignalR Hub. У них нет явного способа отправки сообщения через графический интерфейс, однако недоумок может легко взломать какой-нибудь сценарий и начать отправлять сообщения для всеобщего обозрения.
Это похоже на чат, другими словами, но вы хотите запретить людям отправлять сообщения. Вы только хотите, чтобы они услышали. Имеет смысл?
1 ответ
Удалите метод AddMessage из концентратора.
Это действительно так.
Если вам все еще нужна функциональность из Интернета, то вам нужно будет установить какую-то защиту для проверки. SingalR еще не имеет этого встроенного.
Или, если вам это нужно только из-за пределов Интернета (скажем, сервер просто публикует события), тогда методы внешнего хаба подойдут вам (см. Вещание через хаб извне хаба внизу страницы: https://github.com/SignalR/SignalR/wiki/Hubs)
Другой вариант - проверить аутентификацию в начале любого действия. У вас есть доступ к куки. Но я не уверен насчет нормальной системы членства, так как не пользуюсь ею. Поскольку у вас есть доступ к файлам cookie, вот шаблон, который я использую для аутентификации:
public SomeHub : Hub
{
public void RandomAction()
{
if(!CheckCookie("Role Required"))
{
//In here we have what happens when there is
// a cookie that is associated with the right Role Required
}
}
}
Возможно, вы сможете использовать систему членства в CheckCookie, однако это может помочь:
string CookieName = "Website Authentication";
string vReturn = null;
HttpCookie vCookie = null;
if(HttpContext.Current.Request.Cookies.AllKeys.Any(t => t == CookieName))
vCookie = HttpContext.Current.Request.Cookies[CookieName];
if(vCookie != null)
vReturn = FormsAuthentication.Decrypt(vCookie.Value).Name;
return vReturn;
Имя cookie членства не в этом, это просто наполнитель.