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()
1
John-Luke Laue 10 may. 2019 a las 23:06

3 respuestas

La mejor respuesta

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.

0
John-Luke Laue 14 may. 2019 a las 18:51

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;
            }
        };
1
evilGenius 10 may. 2019 a las 20:37

¿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")].

0
16 may. 2019 a las 07:38