1
votes

AuthorizeAttribute redirige vers une URL incorrecte lorsqu'il est déployé sur un site Web avec un sous-domaine

Normalement (sur mon hôte local par exemple), [Authorize] redirige correctement vers LoginPath spécifié dans les CookieAuthenticationOptions .

Cependant, lorsque je déploie sur mon site de développement ( staging.mysite.com ), la redirection d'autorisation semble égarer une partie de l'url. Dans mon cas, il va:

http: //staging/Account.mysite.com/Login? ReturnUrl =% 2FHome% 2FAuthorize

quand il devrait aller à:

http://staging.mysite.com/Account/Login?ReturnUrl=%2FHome%2FAuthorize

L'application est très basique:

options.LoginPath = "/Login"; //I removed /Account


[HttpGet("/Login")] //I added the "/Login" template
public IActionResult Login()

Mes contrôleurs:

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

Quelqu'un voit où je vais mal?


Étrangement, si je fais les changements ci-dessous, cela fonctionne. Il semble donc que le problème soit lié à la spécification de l'action dans l'itinéraire?

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


0 commentaires

3 Réponses :


1
votes

essayez ceci

options.Events = new CookieAuthenticationEvents()
        {
            OnRedirectToLogin = (context) =>
            {
                context.HttpContext.Response.Redirect("http://staging.mysite.com/Account/Login?ReturnUrl=%2FHome%2FAuthorize");
                return Task.CompletedTask;
            }
        };

Modifier supprimez-le

options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/Account/Login");

et ajoutez-le

options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/Account/Login");


1 commentaires

cela devrait fonctionner, mais je ne veux pas avoir à le faire. Je vais vous donner un vote positif!



0
votes

Avez-vous défini l'itinéraire comme celui-ci?

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional }
    );

Sinon, ajoutez-le dans RouteConfig.cs. Ou vous pouvez définir l'itinéraire directement avec [Route ("route")].


0 commentaires

0
votes

J'ai trouvé le problème.

Le problème n'était pas avec asp.net core ou mon application.

Le problème était lié à une regex de redirection que nous utilisions dans IIS.


0 commentaires