Context.User.Identity.Name è null con SignalR 2.XX Come risolverlo?

Questo mi sta facendo impazzire.

Sto usando l’ultima versione di signalR (2.0.2). Questo è il mio codice hub (OnConnected)

public override Task OnConnected() { //User is null then Identity and Name too. Connections.Add(Context.User.Identity.Name, Context.ConnectionId); return base.OnConnected(); } 

E questo è il metodo di login del mio Controller:

  [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { var user = await UnitOfWork.UserRepository.FindAsync(model.UserName, model.Password); if (user != null) { await SignInAsync(user, model.RememberMe); return RedirectToLocal(returnUrl); } } TempData["ErrorMessage"] = Resources.InvalidUserNameOrPassword; // If we got this far, something failed, redisplay form return RedirectToAction("Index","Home"); } 

Ho scoperto che alcune persone hanno questo problema su OnDisconnected, non ce la faccio nemmeno lì.

Sto usando il modello MCV5.

    Hai idea di cosa c’è che non va?

    Ho trovato la soluzione finale, questo è il codice della mia class di avvio OWIN:

      public void Configuration(IAppBuilder app) { app.MapSignalR(); // Enable the application to use a cookie to store information for the signed i user app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Home/Index") }); // Use a cookie to temporarily store information about a user logging in with a third party login provider app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); app.UseMicrosoftAccountAuthentication(new MicrosoftProvider().GetAuthenticationOptions()); app.UseTwitterAuthentication(new TwitterProvider().GetAuthenticationOptions()); app.UseFacebookAuthentication(new FacebookProvider().GetAuthenticationOptions()); app.UseGoogleAuthentication(new GoogleProvider().GetAuthenticationOptions()); } 

    Preparandomi un caffè, pensai “Che ne dici di mappare SignalR DOPO l’autenticazione, e voilà! Ora è workign come previsto.

      public void Configuration(IAppBuilder app) { // Enable the application to use a cookie to store information for the signed i user app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Home/Index") }); // Use a cookie to temporarily store information about a user logging in with a third party login provider app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); app.UseMicrosoftAccountAuthentication(new MicrosoftProvider().GetAuthenticationOptions()); app.UseTwitterAuthentication(new TwitterProvider().GetAuthenticationOptions()); app.UseFacebookAuthentication(new FacebookProvider().GetAuthenticationOptions()); app.UseGoogleAuthentication(new GoogleProvider().GetAuthenticationOptions()); app.MapSignalR(); } 

    Se stai utilizzando Web Api e SignalR nello stesso progetto, devi mappare SignalR prima di registrare Web Api.

    Cambia questo:

     app.UseWebApi(GlobalConfiguration.Configuration); app.MapSignalR(); 

    A questa:

     app.MapSignalR(); app.UseWebApi(GlobalConfiguration.Configuration); 

    assicurati solo auth. la configurazione è chiamata befor start app.MapMignalrR ()

    l’ho cambiato

      public partial class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR(); ConfigureAuth(app); } } 

    a questa

      public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); app.MapSignalR(); } } 

    abbracci ..

    Se stai mappando /signalr come una “pipeline ramificata” devi farlo in questo modo. Assicurati di utilizzare map.UseCookieAuthentication e non app :

     app.Map("/signalr", map => { map.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/store/youRaccount/login") }); 

    Suggerimento: ho temporaneamente modificato l’incanvasiatura del percorso, quindi quando ti youRaccount nella barra degli URL so che ha funzionato 🙂