none
No puedo acceder a Login en sitio web MVC 5 multi idiomas con routing RRS feed

  • Pregunta

  • Cuando hago clic en los enlaces para iniciar sesión y registrarse no sucede nada y la pagina correspondiente no aparece. Mi archivo RouteConfig.cs se muestra de la siguiente forma:

    using System.Web.Mvc;
    using System.Web.Routing;
    
    namespace eoalak_mvc
    {
        public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapLocalizeRoute("Default",
                    
                    url: "{culture}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });
    
                routes.MapRouteToLocalizeRedirect("RedirectToLocalize",
                    
                            url: "{action}/{id}",
                            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
            }
        }
    }
    

    pero he notado que cuando lo modifico de la siguiente manera (añadiendo '{controller}') los enlaces de iniciar sesión y registrarse funcionan correctamente:

    using System.Web.Mvc;
    using System.Web.Routing;
    
    namespace mysite_mvc
    {
        public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapLocalizeRoute("Default",
                    url: "{culture}/{controller}/{action}/{id}",
                    
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });
    
                routes.MapRouteToLocalizeRedirect("RedirectToLocalize",
                    url: "{controller}/{action}/{id}",
                            
                            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
            }
        }
    }
    

    El problema es que no quiero que aparezca el controller en la URL  (example.com/en/Account/Login) , lo que necesito es que se muestre de esta forma: example.com/en/Login (en todos los apartados de la web).

    He leído en este foro: http://stackoverflow.com/questions/21168955/mvc-5-how-to-define-owin-loginpath-with-localized-routes que es necesario modificar el archivo Startup.Auth.cs , pero no se como hacerlo en el código que tengo:

    using System;
    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.Owin;
    using Microsoft.Owin;
    using Microsoft.Owin.Security.Cookies;
    using Microsoft.Owin.Security.Google;
    using Owin;
    using mysite_mvc.Models;
    
    namespace mysite_mvc
    {
        public partial class Startup
        {
            // Para obtener más información para configurar la autenticación, visite http://go.microsoft.com/fwlink/?LinkId=301864
            public void ConfigureAuth(IAppBuilder app)
            {
                // Configure el contexto de base de datos, el administrador de usuarios y el administrador de inicios de sesión para usar una única instancia por solicitud
                app.CreatePerOwinContext(ApplicationDbContext.Create);
                app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
                app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
    
                // Permitir que la aplicación use una cookie para almacenar información para el usuario que inicia sesión
                // y una cookie para almacenar temporalmente información sobre un usuario que inicia sesión con un proveedor de inicio de sesión de terceros
                // Configurar cookie de inicio de sesión
                app.UseCookieAuthentication(new CookieAuthenticationOptions
                {
                    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                    LoginPath = new PathString("/Account/Login"),
                    Provider = new CookieAuthenticationProvider
                    {
                        // Permite a la aplicación validar la marca de seguridad cuando el usuario inicia sesión.
                        // Es una característica de seguridad que se usa cuando se cambia una contraseña o se agrega un inicio de sesión externo a la cuenta.  
                        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                            validateInterval: TimeSpan.FromMinutes(30),
                            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                    }
                });            
                app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
    
                // Permite que la aplicación almacene temporalmente la información del usuario cuando se verifica el segundo factor en el proceso de autenticación de dos factores.
                app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));
    
                // Permite que la aplicación recuerde el segundo factor de verificación de inicio de sesión, como el teléfono o correo electrónico.
                // Cuando selecciona esta opción, el segundo paso de la verificación del proceso de inicio de sesión se recordará en el dispositivo desde el que ha iniciado sesión.
                // Es similar a la opción Recordarme al iniciar sesión.
                app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
    
                // Quitar los comentarios de las siguientes líneas para habilitar el inicio de sesión con proveedores de inicio de sesión de terceros
                //app.UseMicrosoftAccountAuthentication(
                //    clientId: "",
                //    clientSecret: "");
    
                //app.UseTwitterAuthentication(
                //   consumerKey: "",
                //   consumerSecret: "");
    
                //app.UseFacebookAuthentication(
                //   appId: "",
                //   appSecret: "");
    
                //app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
                //{
                //    ClientId = "",
                //    ClientSecret = ""
                //});
            }
        }
    }
    ¿Cómo podría modificar ese código? o ¿qué debo hacer para que no aparezca el controller en la URL sin afectar el funcionamiento del Login?

    martes, 4 de agosto de 2015 22:28

Respuestas

  • Puedes añadir la ruta del Login en el RouteConfig:

                routes.MapLocalizeRoute("Login",
                    url: "{culture}/Login/{id}",
                    defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional },
                    constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });
    
                routes.MapLocalizeRoute("Default",
                    url: "{culture}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 4 de agosto de 2015 22:43

Todas las respuestas

  • Puedes añadir la ruta del Login en el RouteConfig:

                routes.MapLocalizeRoute("Login",
                    url: "{culture}/Login/{id}",
                    defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional },
                    constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });
    
                routes.MapLocalizeRoute("Default",
                    url: "{culture}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 4 de agosto de 2015 22:43
  • Hola

    Avatar de Asier Villanueva
    Asier

    , gracias por tu respuesta, pero ahora se presenta otro problema, en RouteConfig he añadido este otro código para que funcione el link de registrarse:

    routes.MapLocalizeRoute("Register",
                    url: "{culture}/Register/{id}",
                    defaults: new { controller = "Account", action = "Register", id = UrlParameter.Optional },
                    constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });

    Me he registrado con un correo y una contraseña y ahora en la parte superior de la web aparece: Hola (mi e-mail) y el link para cerrar sesión pero cuando le hago clic no sucede nada, no puedo cerrar sesión. ¿a qué se debe ese inconveniente?


    martes, 4 de agosto de 2015 23:03
  • ¿A qué acción llama el botón cerrar sesión?


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 4 de agosto de 2015 23:19
  • He logrado que funcione el link 'cerrar sesión' añadiendo este código:
    routes.MapLocalizeRoute("LogOff",
                   url: "{culture}/LogOff/{id}",
                   defaults: new { controller = "Account", action = "LogOff", id = UrlParameter.Optional },
                   constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });

    Supongo que esa era la acción:
    LogOff

    martes, 4 de agosto de 2015 23:22