Uso SignalR 1.0.1 come nucleo di chat per l'applicazione ASP.NET MVC3. Utilizzo di IIS 7.5
Esistono due metodi nel controller MVC che fornisce l'accesso alle viste di chat:
1. Il primo metodo è pubblico e consente agli utenti anonimi di chattare, senza autorizzazione.
2. L'accesso al secondo metodo è limitato con l'attributo [Authorize]
, per gli utenti del dominio - agenti di chat.
Non esiste un'autorizzazione esplicitamente specificata nell'hub.
Per questo scenario ho coinvolto sia l'autenticazione Windows che quella anonima su IIS.
Ho implementato anche il fornitore di ruoli personalizzato, che funziona solo in memoria, non persistendo nulla nel database.SignalR - L'ID connessione è nel formato errato quando si utilizza l'autenticazione Windows e anonima
Succede che usando '[Autorizza]' attributo nel metodo di controllo porta a responsing 500 dal mozzo, sia quando chiamata in arrivo dalla vista autorizzato, e l'anonimo uno:
Request (send
è metodo Mozzo per invio di messaggi):
http://localhost:8101/signalr/send?transport=serverSentEvents&connectionToken=VIXEZzWQSn5SNlA8RUy4iaOPDFdvuPBjMvFBiG2FLfvfxF347XHwtapsEV5ndU4OEI0Xb64W2ZRXTqwBiL2CXg2_JlTaTJ2RnVOj4bjvx6tQaYhAqTaXs9k2853GYqzd0
risposta:
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/>
Ma notate, che la connessione a Hub funziona bene, restituisce 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
ho trovato poco filo simile qui su StackOverflow:
signalr The connection id is in the incorrect format
da cui ho capito, che quando invocando il mio metodo Send
, l'Hub elabora la richiesta con Identity
diversa da quella utilizzata per connettersi all'Hub, oppure i riferimenti dell'GetConnectionId
dell'hub, in realtà l'utente non è autorizzato, ma come verifica tale ipotesi, quando non esiste un'autorizzazione specificata sull'hub stesso?
Qualcuno può mettere un po 'di luce su questo?
Grazie in anticipo :)
Grazie per chiarimenti. – mskuza
Ma la parte difficile che ho trovato è che sia 'connect' che' send' vengono eseguiti dopo l'autorizzazione - l'utente chiama il metodo del controller decorato con '[Authorize]' cosa gli fornisce una vista dove si chiama Hub, quindi quando si chiama 'connect' da Javascript, l'utente è già autorizzato. La mia comprensione è che 'Identity' è cambiato prima di qualsiasi chiamata all'Hub - durante l'esecuzione dell'azione MVC. – mskuza
Osservando la traccia dello stack, è abbastanza chiaro che l'identità dell'utente è cambiata tra la richiesta 'negotiate' e' send'. Questo potrebbe essere successo tramite una richiesta AJAX o un timeout di sessione. – halter73