public async Task <IActionResult> OnPostAsync(string returnUrl = null) { returnUrl = returnUrl ?? Url.Content("~/Error/Error"); try { var user = await _userManager.GetUserAsync(User); if (user == null) { return(NotFound($"No se puede dar con el usuario con el ID '{_userManager.GetUserId(User)}'.")); } if (!ModelState.IsValid) { await LoadAsync(user); return(Page()); } try { var datos = ObtenerDatosCliente.Usuario(await _userManager.GetUserIdAsync(user)).Result; } catch (Exception e) { return(NotFound($"No se puede dar con el usuario con el ID '{_userManager.GetUserId(User)}'.")); } if (!await datosIgualAsync(user)) { var datos = ObtenerDatosCliente.Usuario(await _userManager.GetUserIdAsync(user)).Result; var respuesta = await EnviarDatosCliente.ActualizarUsuario( new Usuario() { Idusuario = Input.IdUsuario, IDidentity = await _userManager.GetUserIdAsync(user), Nombre = Input.Nombre, Apellido = Input.Apellido }); if (respuesta.IsSuccessStatusCode) { StatusMessage = "Tus datos personales han cambiado."; return(RedirectToPage()); } } StatusMessage = "Tus datos personales no han cambiado."; return(RedirectToPage()); } catch (Exception e) { return(LocalRedirect(returnUrl)); } }
/// <summary> /// Metodo que crea un nuevo usuario con los datos del inputModel /// </summary> /// <param name="returnUrl"></param> /// <returns></returns> public async Task <IActionResult> OnPostAsync(string returnUrl = null) { returnUrl = returnUrl ?? Url.Content("~/"); if (!await _roleManger.RoleExistsAsync(UsuarioSeleccionado) || UsuarioSeleccionado.Equals("Super Admin")) { StatusMessage = "Hubo un error. El usuario no se ha creado"; return(RedirectToPage()); } if (ModelState.IsValid) { var user = new IdentityUser { UserName = Input.Email, Email = Input.Email }; var result = await _userManager.CreateAsync(user, Input.Password); if (result.Succeeded) { var _user = await _userManager.FindByEmailAsync(Input.Email); var userData = new Usuario { IDidentity = _user.Id, Nombre = Input.Nombre, Apellido = Input.Apellido }; var resultD = await EnviarDatosCliente.CrearUsuario(userData); if (resultD.IsSuccessStatusCode) { await _userManager.AddToRoleAsync(_user, UsuarioSeleccionado); _logger.LogInformation("Se ha creado un nueva cuenta con contraseña."); var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); var callbackUrl = Url.Page( "/Account/ConfirmEmail", pageHandler: null, values: new { area = "Identity", userId = user.Id, code = code }, protocol: Request.Scheme); await _emailSender.SendEmailAsync(Input.Email, "Confirma tu email", $"Por favor confirma tu cuenta <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>presionando aquí.</a>."); if (_userManager.Options.SignIn.RequireConfirmedAccount) { return(RedirectToPage("RegisterConfirmation", new { email = Input.Email })); } else { StatusMessage = "El usuario se ha creado con exito"; return(RedirectToPage()); //await _signInManager.SignInAsync(user, isPersistent: false); //return LocalRedirect(returnUrl); } } else { await _userManager.DeleteAsync(user); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } else { // Se muestran los errores si es que hay. Por ejemplo intentar registrar un correo que ya esta en la bd foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } await LoadAsync(); return(Page()); } } // If we got this far, something failed, redisplay form return(Page()); }
/// <summary> /// Crea los roles en la base de datos de identity si es que no existen, y crea al usuario /// Super Admin, si este no fue creado anteriormente, con los datos que obtiene de appsettings.json /// en SAdm, lo asigna como usuario tanto en la BD de identity como en la BD de cocoteca, /// si algo llega a fallar en el registro, se elimina de ambas, de no ser así se le asigna el rol /// de Super Admin. /// </summary> /// <param name="serviceProvider">Define un mecanismo para obtener un proveedor de sopote a otros objetos</param> /// <returns>Una operación asíncrona</returns> private async Task CreateRoles(IServiceProvider serviceProvider) { //initializing custom roles var RoleManager = serviceProvider.GetRequiredService <RoleManager <IdentityRole> >(); var UserManager = serviceProvider.GetRequiredService <UserManager <IdentityUser> >(); string[] roleNames = { "Super Admin", "Admin", "Almacenista", "Cliente" }; IdentityResult roleResult; foreach (var roleName in roleNames) { var roleExist = await RoleManager.RoleExistsAsync(roleName); if (!roleExist) { //create the roles and seed them to the database: Question 1 roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName)); } } //Here you could create a super user who will maintain the web app var poweruser = new IdentityUser { UserName = Configuration["SAdm:UserName"], Email = Configuration["SAdm:UserEmail"], }; //Ensure you have these values in your appsettings.json file string userPWD = Configuration["SAdm:UserPassword"]; var _user = await UserManager.FindByEmailAsync(Configuration["SAdm:AdminUserEmail"]); if (_user == null) { var createPowerUser = await UserManager.CreateAsync(poweruser, userPWD); if (createPowerUser.Succeeded) { poweruser = await UserManager.FindByEmailAsync(Configuration["SAdm:AdminUserEmail"]); var resul = await EnviarDatosCliente.CrearUsuario( new Usuario() { IDidentity = poweruser.Id, Nombre = Configuration["SAdm:Nombre"], Apellido = Configuration["SAdm:Apellido"] }); if (resul.IsSuccessStatusCode) { //here we tie the new user to the role await UserManager.SetLockoutEnabledAsync(poweruser, false); await UserManager.AddToRoleAsync(poweruser, "Super Admin"); var code = await UserManager.GenerateEmailConfirmationTokenAsync(poweruser); code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code)); await UserManager.ConfirmEmailAsync(poweruser, code); } else { await UserManager.DeleteAsync(poweruser); } } } }
/// <summary> /// Verifica que la información sea correcta, si es así realiza el registro del usuario. /// </summary> /// <param name="returnUrl">URL de reedirección</param> /// <returns>Si la información es correcta lo redirige a la página correspondiente, de lo /// contrario le indica los errores en el formulario.</returns> public async Task <IActionResult> OnPostAsync(string returnUrl = null) { returnUrl = returnUrl ?? Url.Content("~/"); ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); if (ModelState.IsValid) { var user = new IdentityUser { UserName = Input.Email, Email = Input.Email }; var result = await _userManager.CreateAsync(user, Input.Password); if (result.Succeeded) { var _user = await _userManager.FindByEmailAsync(Input.Email); var userData = new Usuario { IDidentity = _user.Id, Nombre = Input.Nombre, Apellido = Input.Apellido }; var resultD = await EnviarDatosCliente.CrearUsuario(userData); await _userManager.AddToRoleAsync(_user, "Cliente"); if (resultD.IsSuccessStatusCode) { _logger.LogInformation("User created a new account with password."); var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); var callbackUrl = Url.Page( "/Account/ConfirmEmail", pageHandler: null, values: new { area = "Identity", userId = user.Id, code = code }, protocol: Request.Scheme); await _emailSender.SendEmailAsync(Input.Email, "Confirma tu email", $"Por favor confirma tu cuenta <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>presionando aquí.</a>."); if (_userManager.Options.SignIn.RequireConfirmedAccount) { return(RedirectToPage("RegisterConfirmation", new { email = Input.Email })); } else { await _signInManager.SignInAsync(user, isPersistent : false); return(LocalRedirect(returnUrl)); } } else { await _userManager.DeleteAsync(user); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } } // If we got this far, something failed, redisplay form return(Page()); }
/// <summary> /// Verifica que los datos introducidos sean correctos y estén completos, si es así actualiza la base de datos, /// crea la dirección si el usuario no tiene una. /// </summary> /// <returns>El formulario con una confirmación de los cambios o la señalización de los errores.</returns> public async Task <IActionResult> OnPostAsync() { string returnUrl = Url.Content("~/Error/Error"); try { var user = await _userManager.GetUserAsync(User); if (user == null) { return(NotFound($"No se puede dar con el usuario con el ID '{_userManager.GetUserId(User)}'.")); } if (!ModelState.IsValid) { await LoadAsync(user); return(Page()); } if (!ObtenerDatosCliente.DireccionExiste(user.Id).Result) { var respuesta = await EnviarDatosCliente.CrearDireccion(new Direccion() { calle = Input.Calle, codigoPostal = Input.CodigoPostal, idusuario = ObtenerDatosCliente.Usuario(user.Id).Result.Idusuario, idmunicipio = IdMunicipioSeleccionado, noExterior = Input.NoExt, noInterior = Input.NoInt }); if (respuesta.IsSuccessStatusCode) { StatusMessage = "Tu direccion ha cambiado."; return(RedirectToPage()); } } else { if (!await dirIgualAsync(user)) { var datos = ObtenerDatosCliente.Direccion(await _userManager.GetUserIdAsync(user)).Result; var respuesta = await EnviarDatosCliente.ActualizarDireccion( new Direccion() { calle = Input.Calle, codigoPostal = Input.CodigoPostal, idusuario = ObtenerDatosCliente.Usuario(user.Id).Result.Idusuario, idmunicipio = IdMunicipioSeleccionado, noExterior = Input.NoExt, noInterior = Input.NoInt, iddireccion = Input.IdDir }); if (respuesta.IsSuccessStatusCode) { StatusMessage = "Tu direccion ha cambiado."; return(RedirectToPage()); } } } StatusMessage = "Tu direccion no ha cambiado."; return(RedirectToPage()); } catch (Exception e) { return(LocalRedirect(returnUrl)); } }