none
Authorize siempre me direcciona al Home/Index (AspNet Core 2.1) RRS feed

  • Pregunta

  • Buenas,

    Tengo el siguiente método de acción Account/Login

    public IActionResult Login()
    {
    	if (AuthHelper.UsuarioAutenticado)
    		return RedirectToAction("Index", "Home", new { area = "" });
    
    	return View();
    }

    si el usuario está autenticado le muestra la vista principal del sistema, caso contrario, le muestra el formulario de Login para que ingrese las credenciales,

    Tengo un controlador Asistencia decorado con un atributo CustomAuthorize que hereda de Authorize. Este atributo quiero utilizarlo para restringir los accesos cuando los usuarios no estén logueados en el sistema y redireccionarlos al Account/Login.

    public class CustomAhorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
    {
    	public void OnAuthorization(AuthorizationFilterContext context)
    	{
    		if (!AuthHelper.UsuarioAutenticado)
    		{
    			var route = new RouteValueDictionary(new { controller = "Account", action = "Login", area = "" });
    
    			context.Result = new RedirectToRouteResult(route);
    		}
    	}
    }

    Pero sucede que una vez autenticado e intento ingresar a Asistencia/Index, me redirecciona a Home/Index, es decir, a la página principal del sistema y veo que esto ocurre porque se está invocando a Account/Login antes de ingresar a Asistencia/Index.

    Tengo configurado lo siguiente en Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
    	services.Configure<CookiePolicyOptions>(options =>
    	{
    		// This lambda determines whether user consent for non-essential cookies is needed for a given request.
    		options.CheckConsentNeeded = context => true;
    		options.MinimumSameSitePolicy = SameSiteMode.None;
    	});
    
    	services.AddSession(options =>
    	{
    		options.IdleTimeout = TimeSpan.FromMinutes(10);
    		options.Cookie.HttpOnly = true;
    		options.Cookie.IsEssential = true;
    	});
    
    	services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    
    	services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    	.AddCookie(options =>
    	{
    		options.LoginPath = "/Account/LogIn";
    		options.LogoutPath = "/Account/LogOff";
    	});
    
    	services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    Saludos.

    lunes, 5 de agosto de 2019 19:55

Respuestas

  • Hola. Cuando generes la cookie, o sea tu ClaimsPrincipal, debes establecer los claims de nombre y de userName. Entonces de la cookie deberías leer esos datos grabados en la misma. (leyendo de la colección Claims) 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta eduar2083 martes, 6 de agosto de 2019 4:40
    lunes, 5 de agosto de 2019 23:03
    Moderador

Todas las respuestas

  • Hola. Si pones un punto de parada en el código de tu atributo, la ejecución del mismo es correcta? Es decir, no entra en la condición? 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 5 de agosto de 2019 20:33
    Moderador
  • Hola Sergio,

    Efectivamente, en el atributo no entra en la condición que redirecciona al Home/Index:

    Lo que redireccional al Home/Index es el action Account/Login ya que se está yendo ahí antes de irse al Asistencia/Index:

    Es más nisiquiera llega a ejecutarse el action Asistencia/Index




    • Editado eduar2083 lunes, 5 de agosto de 2019 21:17
    lunes, 5 de agosto de 2019 21:12
  • Vale. Eso pasa porque no estás enviando la cookie de autenticación. Eso lo has definido aqui

    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    	.AddCookie(options =>
    	{
    		options.LoginPath = "/Account/LogIn";
    		options.LogoutPath = "/Account/LogOff";
    	});
    Puedes mostrar cómo realizas el login? 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    lunes, 5 de agosto de 2019 21:20
    Moderador
  • En tu Método de login debes tener algo parecido a esto para generar la cookie

    await HttpContext.SignInAsync(
        CookieAuthenticationDefaults.AuthenticationScheme, 
        new ClaimsPrincipal(claimsIdentity), 
        authProperties);


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 5 de agosto de 2019 21:23
    Moderador
  • >>Pero sucede que una vez autenticado e intento ingresar a Asistencia/Index, me redirecciona a Home/Index, es decir, a la página principal del sistema y veo que esto ocurre

    es porque usas cookies, lo cual mantiene la autenticacion

    valida de limpiar las cookies del browser y depues ingresar, si conserva los datos de als credenciales autentica directamente

    Pero no necesitas ningun atributo custom, esto ya lo realiza el Autorize directamente, creo que deberias quitar el  CustomAuthorize

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    lunes, 5 de agosto de 2019 22:41
  • He estado trabajando mal el Login. Por cuestión de tiempo se me pidió que trabaje solo utilizando el objeto Session pero veo que eso da más problemas. Lo he modificado de la siguiente manera:

    Ahora bien, tengo una clase AuthHelper a través de la cual determinadaba si el usuario estaba autenticado accediendo al objeto Session, también obtenía algunos datos almacenados en dicho objeto como el Username o el Nombre:

    public class AuthHelper
    {
    	public static bool UsuarioAutenticado
    	{
    		get
    		{
    			//IPrincipal user = HttpContext.Current.User;
    			//return user.Identity.IsAuthenticated;
    
    			var httpContext = new HttpContextAccessor().HttpContext;
    			var user = httpContext.Session.Get<Capacitador>("User");
    			return user != null;
    		}
    	}
    
    	public static void CerrarSesion()
    	{
    		//FormsAuthentication.SignOut();
    		//OwinHelper.AuthenticationManager.SignOut();
    
    		var httpContext = new HttpContextAccessor().HttpContext;
    		httpContext.Session.Remove("User");
    	}
    
    	public static string GetUserName()
    	{
    		var httpContext = new HttpContextAccessor().HttpContext;
    		var user = httpContext.Session.Get<Capacitador>("User");
    		return user != null ? user.NombreUsuario : null;
    	}
    
    	public static string GetNombre()
    	{
    		var httpContext = new HttpContextAccessor().HttpContext;
    		var user = httpContext.Session.Get<Capacitador>("User");
    		return user != null ? user.Nombres : null;
    	}
    }

    Ahora cómo puedo adaptar esto para ya no trabajar con el objeto Session?

    lunes, 5 de agosto de 2019 22:53
  • Hola. Cuando generes la cookie, o sea tu ClaimsPrincipal, debes establecer los claims de nombre y de userName. Entonces de la cookie deberías leer esos datos grabados en la misma. (leyendo de la colección Claims) 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta eduar2083 martes, 6 de agosto de 2019 4:40
    lunes, 5 de agosto de 2019 23:03
    Moderador
  • Hola.

    He agregado los claims:

    Se ejecuta HttpContext.SignInAsync correctamente, pero cuando acceso al Identity desde la clase AuthHelper, me dice que no está autenticado a pesar que he iniciado sesión correctamente.

    Tampoco puedo obtener los Claims:

    martes, 6 de agosto de 2019 3:01
  • Me faltaba la línea:

    app.UseAuthentication();

    En el método Configure del Startup.cs

    Muchas gracias. Saludos.

    martes, 6 de agosto de 2019 4:39