Normalmente (en mi host local, por ejemplo), [Authorize]
redirige correctamente a LoginPath
especificado en CookieAuthenticationOptions
.
Sin embargo, cuando realizo la implementación en mi sitio de preparación (staging.mysite.com
), la redirección de autorización parece extraviar parte de la URL. En mi caso, va a:
http://staging/Account.mysite.com/Login?ReturnUrl=%2FHome%2FAuthorize
Cuando debería ir a:
http://staging.mysite.com/Account/Login?ReturnUrl=%2FHome%2FAuthorize
La aplicación es muy básica:
//Startup.cs
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
options.LogoutPath = "/Account/Logout";
options.AccessDeniedPath = "/Home/Unauthorized";
options.ReturnUrlParameter = "ReturnUrl";
});
services.AddMvc()
//....
app.UseMvc();
Mis controladores:
//HomeController.cs
[Route("[controller]/[action]")]
public class HomeController : Controller
{
[Authorize]
public IActionResult Authorize()
{
return Ok("You are authorized");
}
}
//AccountController.cs
[Route("[controller]/[action]")]
public class AccountController : Controller
{
public IActionResult Login()
{
return View(new LoginViewModel());
}
}
¿Alguien ve dónde me estoy equivocando?
ACTUALIZACIÓN:
Curiosamente, si hago los cambios a continuación, funciona. Entonces, ¿parece que el problema es tener la acción especificada en la ruta?
options.LoginPath = "/Login"; //I removed /Account
[HttpGet("/Login")] //I added the "/Login" template
public IActionResult Login()
3 respuestas
Encontró el problema.
El problema era no con asp.net core o mi aplicación.
El problema era con una expresión regular de redireccionamiento que estábamos usando en IIS.
Probar esto
options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/Account/Login");
Editar, eliminarlo
options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/Account/Login");
Y añádelo
options.Events = new CookieAuthenticationEvents()
{
OnRedirectToLogin = (context) =>
{
context.HttpContext.Response.Redirect("http://staging.mysite.com/Account/Login?ReturnUrl=%2FHome%2FAuthorize");
return Task.CompletedTask;
}
};
¿Definiste una ruta como esta?
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional }
);
Si no, agréguelo en RouteConfig.cs. O puede definir la ruta directamente con [Ruta ("ruta")].
Preguntas relacionadas
Nuevas preguntas
c#
C # (pronunciado "see sharp") es un lenguaje de programación multi-paradigma de alto nivel, estáticamente tipado desarrollado por Microsoft. El código C # generalmente se dirige a la familia de herramientas y tiempos de ejecución .NET de Microsoft, que incluyen .NET Framework, .NET Core y Xamarin, entre otros. Use esta etiqueta para preguntas sobre el código escrito en las especificaciones formales de C # o C #.