Używam SignalR 1.0.1 jako rdzenia czatu dla aplikacji ASP.NET MVC3. Korzystanie z IIS 7.5
Istnieją dwie metody w kontrolerach MVC, które zapewniają dostęp do widoków czatu: 1. 1. Pierwsza metoda jest publiczna, umożliwiając anonimowym użytkownikom czatowanie - bez autoryzacji.
2. Dostęp do drugiej metody jest ograniczony atrybutem [Authorize]
dla użytkowników domeny - agentów czatu.
Nie ma jawnie określonej autoryzacji w centrum.
W tym scenariuszu obejmowałem zarówno uwierzytelnianie Windows, jak i anonimowe w IIS.
Zaimplementowałam również niestandardowego Dostawcę Ról, który działa tylko w pamięci - nie zachowując niczego w bazie danych.SignalR - Identyfikator połączenia ma niepoprawny format podczas korzystania z uwierzytelniania Windows i anonimowego
Co się dzieje, że za pomocą „[Autoryzacja]” atrybut w metodzie kontrolera prowadzi do responsing 500 z Hub, zarówno gdy wywołanie pochodzi z autoryzowanego widzenia, a anonimowy jeden:
kupna (send
jest metoda Hub dla wysyłanie wiadomości):
http://localhost:8101/signalr/send?transport=serverSentEvents&connectionToken=VIXEZzWQSn5SNlA8RUy4iaOPDFdvuPBjMvFBiG2FLfvfxF347XHwtapsEV5ndU4OEI0Xb64W2ZRXTqwBiL2CXg2_JlTaTJ2RnVOj4bjvx6tQaYhAqTaXs9k2853GYqzd0
Response:
The connection id is in the incorrect format.
Server stack trace:
at Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId(HostContext context, String connectionToken)
at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext context)
at Microsoft.AspNet.SignalR.Owin.CallHandler.Invoke(IDictionary2 environment)
at Microsoft.AspNet.SignalR.Owin.Handlers.HubDispatcherHandler.Invoke(IDictionary2 environment)
at Microsoft.Owin.Host.SystemWeb.OwinCallContext.Execute()
at Microsoft.Owin.Host.SystemWeb.OwinHttpHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object extraData)<br/><br/>
jednak informacja, że podłączenie do Hub działa prawidłowo, zwraca 200 OK:
http://localhost:8101/signalr/connect?transport=serverSentEvents&connectionToken=dYOwFxa1mkgdpzw-jitRpWq9oxRlrTet8U_dAzWjFQEdGNJfVXeG7Op0NZZwvznxeNdJCuPT75CKzQqI9HRPThV3uEDt-Z2qtIl9E02gF481&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&tid=9
znalazłem trochę similiar wątek tutaj na stackoverflow:
signalr The connection id is in the incorrect format
z których rozumiem, że kiedy wywołując moją metodę Send
, Hub przetwarza żądanie o numerze Identity
innym niż używany do łączenia się z Hubem, LUB Hubem znajduje się GetConnectionId
, że użytkownik faktycznie nie jest autoryzowany - ale jak sprawdza to założenie, kiedy nie ma autoryzacji określonej w samym Hubie?
Czy ktoś może rzucić trochę światła na to?
góry dzięki :)
Dzięki za wyjaśnienie. – mskuza
Ale najtrudniejsza część, którą znalazłem, polega na tym, że zarówno 'connect', jak i' send' są wykonywane po autoryzacji - metoda kontrolera wywołań użytkownika ozdobiona '[Authorize]' co zapewnia mu widok, gdzie ma miejsce wywołanie Hub - tak podczas wywoływania 'connect' z Javascript, użytkownik jest już autoryzowany. Rozumiem, że 'Identity' zmienia się przed każdym wywołaniem do Hub - podczas wykonywania akcji MVC. – mskuza
Patrząc na twój ślad stosu, jest całkiem jasne, że "Tożsamość" Twojego użytkownika zmieniła się pomiędzy żądaniem "negocjuj" i "wyślij". Mogło to nastąpić za pośrednictwem żądania AJAX lub limitu czasu sesji. – halter73