none
Login personalizado con asp.net core 2.2 RRS feed

  • Pregunta

  • Buen día, les comento, he realizado las vistas de login, register, confirmEmail, etc, etc..., con un nuevo maquetado y diseño de estas vistas, por lo que no estoy utilizando un layout como tal. Dichas vistas están en el directorio Views/Account, y por ende tengo un controlador AccountController, de entrada realicé las pruebas de que todo funcionara bien, he hecho el registro de una cuenta y el log in. El problema viene aquí, ahora necesito que cuando se registre una cuenta, esta sea confirmada por email. Para ello estoy trabajando con el servicio de SMTP que ofrece SendGrid. Hasta el momento he hecho las configuraciones que tenemos en el manual de Microsoft ACCOUNT CONFIRM.

    Ahora bien, cuando hago el registro de una nueva cuenta de usuario, el link de confirmación me es enviada a la cuenta de email, hasta aqui todo bien, el detalle es que cuando hago click en dicho enlace de confirmación, me debería redireccionar a la vista ConfirmEmail y a la vez mandarme un valor verdadero a mi campo EmailConfirmed de la Tabla Users y  NO LO HACE. De entrada les agradezco puedan auxiliarme con este problema.

    Les pondré el código principal de Startup

      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.AddDbContext<GeoIIoTContext>(options =>
                        options.UseSqlServer(Configuration.GetConnectionString("GeoIIoTContext"), x => x.UseNetTopologySuite()));

                services.AddIdentity<IdentityUser, IdentityRole>(config =>
                {
                    config.SignIn.RequireConfirmedEmail = true;
                })
                    .AddEntityFrameworkStores<GeoIIoTContext>().AddDefaultTokenProviders();

                services.AddTransient<IEmailSender, EmailSender>();
                services.Configure<AuthMessageSenderOptions>(Configuration);
                    //

                services.AddMvc(options =>
                {
                    options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Point)));
                    options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(LineString)));
                    options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(MultiLineString)));
                    options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Polygon)));
                    options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Feature)));
                }).AddJsonOptions(options =>
                {
                    foreach (var converter in GeoJsonSerializer.Create(new GeometryFactory(new PrecisionModel(), 4326)).Converters)
                    {
                        options.SerializerSettings.Converters.Add(converter);
                    }
                }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    El método register

     public async Task<IActionResult> Register(RegisterViewModel model, string returnUrl = null)
            {
                returnUrl = returnUrl ?? Url.Content("~/");
                if (ModelState.IsValid)
                {
                    var user = new IdentityUser { UserName = model.Email, Email = model.Email};
                    var result = await userManager.CreateAsync(user, model.Password);
                    if (result.Succeeded) {
                        //Linea que permite registrar una cuenta email, sin confirmar
                        //await signInManager.SignInAsync(user, isPersistent : false);
                        var code = await userManager.GenerateEmailConfirmationTokenAsync(user);
                        var callbackUrl = Url.Page(
                            "/Account/ConfirmEmail",
                            pageHandler: null,
                            values: new { userId = user.Id, code = code },
                            protocol: Request.Scheme);

                            await _emailSender.SendEmailAsync(model.Email, "Confirm your email",
                            $"Please confirm you account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>Clicking here</a>");

                        return LocalRedirect(returnUrl);
                    }

                    foreach (var error in result.Errors)
                    {
                        ModelState.AddModelError("",error.Description);
                    }
                }

                return View(model);
            }

    Esta es la dirección de enlace que me llega a la cuenta de correo para realizar la confirmación, si no me equivoco aquí es donde empieza mi problema, suponiendo que la ruta debería ser  Account/ConfirmEmail , https://localhost:44312/Account/Register?userId=dc3d3c25-c41e-459a-89ed-0594e2aa6109&code=CfDJ8A7zs7RxdEZPu5TBisMjgsGQLG4xVJtbZlVJG%2Bjpof1%2B8oWyQ8QwKSeWlG674nVgwp%2FAbYL5Ewk7SJCnU6btOwsIeeJa6H6kLQL0FqQjhIlgmCsTIvlq4NIL4oluDnFwwHcgBodniLZkMPUNafCBtjfcdUWagMqQI4b1Cr%2Fq166yrpSP498cluQ%2BdmZDf6C2JfVeR4UKSbHpXBMKdGMPkmLMj2ju2lFBrtSZvuAzFMlaB27YMl5i%2F3uL0SEs7aAOCQ%3D%3D&page=%2FAccount%2FConfirmEmail

    Este código se encuentra en el manual de Microsoft dentro del archivo StartUp.cs y que yo he cambiado para que me trabaje las vistas que he creado:

    services.AddDefaultIdentity<IdentityUser>(config => { config.SignIn.RequireConfirmedEmail = true; }) .AddDefaultUI(UIFramework.Bootstrap4) .AddEntityFrameworkStores<ApplicationDbContext>();

     

                                        

    martes, 23 de julio de 2019 16:20