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 ..