signal reconnecting net hubconfiguration hub grupos context asp.net-mvc authentication signalr signalr-hub owin

asp.net-mvc - net - signalr reconnecting



Context.User.Identity.Name es nulo con SignalR 2.XX ¿Cómo solucionarlo? (4)

Encontré la solución final, este es el código de mi clase de inicio de 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()); }

Preparándome un café, pensé "¿Qué pasa con el mapeo de SignalR DESPUÉS de la autenticación, y listo! Ahora está funcionando como se esperaba.

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(); }

Esto me está volviendo loco.

Estoy usando la última versión de signalR (2.0.2). Este es mi código de concentrador (Conectado)

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

Y este es el método de inicio de sesión de mi controlador:

[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> 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"); }

Descubrí que algunas personas tienen este problema en OnDisconnected, ni siquiera lo logro.

Estoy usando la plantilla MCV5.

¿Tienes alguna idea de lo que está mal?


Si está mapeando /signalr como una ''tubería ramificada'', debe hacerlo así. Asegúrate de usar map.UseCookieAuthentication y no la app :

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

Sugerencia: cambié temporalmente la carcasa de la ruta, así que cuando veo youRaccount en la barra de URL sé que funcionó :-)


Si está utilizando Web Api y SignalR en el mismo proyecto, debe mapear SignalR antes de registrar Web Api.

Cambia esto:

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

A esto:

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


solo asegúrate de auth. la configuración se llama antes de iniciar la aplicación.MapMignalrR ()

Cambié esto

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

a esto

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

abrazos ..