none
Problema para encriptar contrasena, passwords; en ASP NET MVC 5 RRS feed

  • Pregunta

  • Hola amigos del foro tengo un pequeño problema para encriptar contraseñas en mi proyecto, lo que pasa es que al crear el usuario me da un error ya que hay un conflicto como estoy usando DataAnotations me sale esto

    Ya identifique cual es el problema hay un conflicto ya que la validacion pide una contraseña con 1 Mayuscula,Minuscula,Numero y simbolo de caracter especial @!$

    Y al encriptar la contraseña me da esto y todo es en minuscula, la encriptacion se esta haciendo antes de guardar y eso ocasiona problema ya que el dataanotations lo detecta

    Lo que quiero hacer es que primero guarde como se esta guardando la contraseña y despues haga la encriptacion en la base de datos

    Les dejo los códigos que use

    1.- Este es el algoritmo para la encriptacion

    public class ShadowMan
        {
            public static string GetSHA256(string str)
            {
                SHA256 sha256 = SHA256Managed.Create();
                ASCIIEncoding encoding = new ASCIIEncoding();
                byte[] stream = null;
                StringBuilder sb = new StringBuilder();
                stream = sha256.ComputeHash(encoding.GetBytes(str));
                for (int i = 0; i < stream.Length; i++) sb.AppendFormat("{0:x2}", stream[i]);
                return sb.ToString();
            }
        }

    2.- Este es el de los Dataanotations en usuario.cs

    [Required]
            [DataType(DataType.Password)]
            [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 8)]
            [RegularExpression("^((?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])|(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[^a-zA-Z0-9])|(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[^a-zA-Z0-9])|(?=.*?[a-z])(?=.*?[0-9])(?=.*?[^a-zA-Z0-9])).{8,}$", ErrorMessage = "Las contraseñas deben tener al menos 8 caracteres y contener minimamente 1 de los siguientes: mayúsculas(A - Z), minúsculas(a - z), números(0 - 9) y un carácter especial(por ejemplo, @ # $% ^ & *!)")]
            [Display(Name = "Password")]
            public string password { get; set; }

    3.- Y aqui este el del controlador cuando crear y guarda el nuevo usuario

    using (EscuelaDBEntitiesUsuarios DB = new EscuelaDBEntitiesUsuarios())
                    {
                        if (Username.id == 0)
                        {
                            Username.password = ShadowMan.GetSHA256(model.password); //Aqui hago la encriptacion
                            DB.usuario.Add(Username);
                            DB.SaveChanges();
                        }
                        else
                        {
                            DB.Entry(Username).State = EntityState.Modified;
                            DB.SaveChanges();
    
                        }
                    }

    Espero puedan ayudarme me dijieron que primero guarde valide y despues encripte pero no se como


    • Editado Geardarko viernes, 12 de julio de 2019 16:46 error de titulo
    viernes, 12 de julio de 2019 16:45

Respuestas

  • Hola, como te he comentado, en este método

    [HttpPost]
    public ActionResult NuevoUsuarioEditar(usuario Username,usuario model)

    Deberías primero hacer la validación del modelo recibido con ModelState.IsValid. Así antes de hacer nada verificas que el password cumple las reglas de tus anotaciones. Haz esa prueba, si quieres escribes lo siguiente y pon un punto de parada. Una vez se detenga, verifica el contenido de ModelState

    var isValid = ModelState.IsValid;


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

    domingo, 14 de julio de 2019 22:53
    Moderador

Todas las respuestas

  • Me han dicho que primero seria guardar la contraseña y luego encriptarlo pero no he encontrado como implementar eso en codigo
    sábado, 13 de julio de 2019 2:10
  • Hola Geardarko:

    Puedes validar la contraseña con JQuery y eliminar la anotación de la expresión regular, que ya haces en capa cliente.

    https://www.baulphp.com/validar-contrasena-segura-jQuery/

    sábado, 13 de julio de 2019 6:09
  • Hola. Lo primero que deberías hacer es si al llegar la petición su modelo es correcto, es decir que cumple con las anotaciones. Usa Model.IsValid para ver si es valido, si no lo fuera, en tu controlador deberías devolver tu vista para establecer los mensajes de error. Puedes mostrarnos el código completo de la vista y del controlador? 

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


    sábado, 13 de julio de 2019 8:33
    Moderador
  • Ejemplo de uso

    [HttpPost]
    public ActionResult Add(AddUserVM model)
    {
        if(model.FirstName == model.LastName)
        {
            ModelState.AddModelError("LastName", "The last name cannot be the same as the first name.");
        }
        if(!ModelState.IsValid)
        {
            return View(model);
        }
        return RedirectToAction("Index");
    }


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

    sábado, 13 de julio de 2019 8:35
    Moderador
  • No te entendi bien, Claro que si, esta es el del controlador que hace uso de la encriptacion y donde se crea el nuevo usuario

    using PaginaWebEscuela.Filters;
    using PaginaWebEscuela.Models;
    using System.Data.Entity.Infrastructure;
    using System.IO;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace PaginaWebEscuela.Controllers
    {
        public class AdminController : Controller
        {
            // GET: Admin
            [AuthorizeUser(idOperacion : 2)]
            public ActionResult Index()
            {
                return View();
            }
    
            public ActionResult Usuarios()
            {
                return View(ObtenerUsuarios());
            }
    
            IEnumerable<usuario> ObtenerUsuarios()
            {
                using (EscuelaDBEntitiesUsuarios BD = new EscuelaDBEntitiesUsuarios())
                {
                    return BD.usuario.ToList<usuario>();
                }
            }
    
            public ActionResult NuevoUsuarioEditar(int id = 0)
            {
                usuario Username = new usuario();
                if (id != 0)
                {
                    using (EscuelaDBEntitiesUsuarios DB = new EscuelaDBEntitiesUsuarios())
                    {
                        Username = DB.usuario.Where(x => x.id == id).FirstOrDefault<usuario>();
                    }
                }
                return View(Username);
            }
    
            [HttpPost]
            public ActionResult NuevoUsuarioEditar(usuario Username,usuario model)
            {
                try
                {
                    if (Username.ImageUpload != null)
                    {
                        string fileName = Path.GetFileNameWithoutExtension(Username.ImageUpload.FileName);
                        string extension = Path.GetExtension(Username.ImageUpload.FileName);
                        fileName = fileName + DateTime.Now.ToString("yymmssfff") + extension;
                        Username.ImagePath = "~/AppFiles/Images/" + fileName;
                        Username.ImageUpload.SaveAs(Path.Combine(Server.MapPath("~/AppFiles/Images/"), fileName));
                    }
                    using (EscuelaDBEntitiesUsuarios DB = new EscuelaDBEntitiesUsuarios())
                    {
                        if (Username.id == 0)
                        {
                            Username.password = ShadowMan.GetSHA256(model.password);
                            DB.usuario.Add(Username);
                            DB.SaveChanges();
                        }
                        else
                        {
                            DB.Entry(Username).State = EntityState.Modified;
                            DB.SaveChanges();
    
                        }
                    }
                    return Json(new { success = true, html = GlobalClass.RenderRazorViewToString(this, "Usuarios", ObtenerUsuarios()), message = "Submitted Successfully" }, JsonRequestBehavior.AllowGet);
                }
                catch (Exception ex)
                {
    
                    return Json(new { success = false, message = ex.Message }, JsonRequestBehavior.AllowGet);
                }
            }
    
        }
    
        }
    


    Esta es la vista donde se agregar el usuario

    @model PaginaWebEscuela.Models.usuario
    
    @{
        ViewBag.Title = "NuevoUsuarioEditar";
        Layout = null;
    }
    
    @using (Html.BeginForm("NuevoUsuarioEditar", "Admin", FormMethod.Post, new { enctype = "multipart/form-data", onSubmit = "return jQueryAjaxPost(this);", data_restUrl = Url.Action("NuevoUsuarioEditar", "Admin", new { id = 0 }) }))//data-resetUrl
    {
        @Html.AntiForgeryToken()
        <div class="row">
            <div class="form-horizontal">
                @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                @Html.HiddenFor(model => model.id)
                @Html.HiddenFor(model => model.ImagePath)
                <div class="col-md-6">
                    <div class="form-group">
                        @Html.LabelFor(model => model.nombre, htmlAttributes: new { @class = "control-label col-md-2" })
                        <div class="col-md-10">
                            @Html.EditorFor(model => model.nombre, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model.nombre, "", new { @class = "text-danger" })
                        </div>
                    </div>
    
                    <div class="form-group">
                        @Html.LabelFor(model => model.email, htmlAttributes: new { @class = "control-label col-md-2" })
                        <div class="col-md-10">
                            @Html.EditorFor(model => model.email, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model.email, "", new { @class = "text-danger" })
                        </div>
                    </div>
    
                    <div class="form-group">
                        @Html.LabelFor(model => model.password, htmlAttributes: new { @class = "control-label col-md-2" })
                        <div class="col-md-10">
                            @Html.EditorFor(model => model.password, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model.password, "", new { @class = "text-danger" })
                        </div>
                    </div>
    
                    <div class="form-group">
                        @Html.LabelFor(model => model.fecha, htmlAttributes: new { @class = "control-label col-md-2" })
                        <div class="col-md-10">
                            @Html.EditorFor(model => model.fecha, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model.fecha, "", new { @class = "text-danger" })
                        </div>
                    </div>
    
                    <div class="form-group">
                        @Html.LabelFor(model => model.idRol, htmlAttributes: new { @class = "control-label col-md-2" })
                        <div class="col-md-10">
                            <select class="form-control" id="idRol" name="idRol">
                                <option value="1">Administrador</option>
                                <option value="2">Capturista</option>
                            </select>
                            @Html.ValidationMessageFor(model => model.idRol, "", new { @class = "text-danger" })
                        </div>
                    </div>
    
                    <div class="form-group">
                        @Html.LabelFor(model => model.apellido1, htmlAttributes: new { @class = "control-label col-md-2" })
                        <div class="col-md-10">
                            @Html.EditorFor(model => model.apellido1, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model.apellido1, "", new { @class = "text-danger" })
                        </div>
                    </div>
    
                    <div class="form-group">
                        @Html.LabelFor(model => model.apellido2, htmlAttributes: new { @class = "control-label col-md-2" })
                        <div class="col-md-10">
                            @Html.EditorFor(model => model.apellido2, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model.apellido2, "", new { @class = "text-danger" })
                        </div>
                    </div>
    
                    <div class="form-group">
                        <div class="col-md-offset-2 col-md-10">
                            <input type="submit" value="Submit" class="btn btn-default" />
                            @if (Model.id != 0)
                            {
                                <a class="btn btn-success" onclick="refreshAddNewTab('@Url.Action("NuevoUsuarioEditar","Admin",new{id=0})',false)"><i class="fa fa-plus"></i> Agregar Nuevo</a>
                            }
                        </div>
                    </div>
                </div>
    
                <div class="col-md-6">
                    <div class="form-group">
                        @Html.LabelFor(model => model.ImagePath, htmlAttributes: new { @class = "control-label col-md-2" })
                        <div class="col-md-10">
                            <img src="@Url.Content(Model.ImagePath)" style="margin:10px" height="200" width="200" id="imagePreview" />
                            <input type="file" name="ImageUpload" accept="image/jpeg, image/png" onchange="ShowImagePreview(this,document.getElementById('imagePreview'))" />
                        </div>
                    </div>
                </div>
    
            </div>
        </div>
    }

    Esta es la clase que hace la funcion de encriptar

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Security.Cryptography;
    namespace PaginaWebEscuela.Filters
    {
        public class ShadowMan
        {
            public static string GetSHA256(string str)
            {
                SHA256 sha256 = SHA256Managed.Create();
                ASCIIEncoding encoding = new ASCIIEncoding();
                byte[] stream = null;
                StringBuilder sb = new StringBuilder();
                stream = sha256.ComputeHash(encoding.GetBytes(str));
                for (int i = 0; i < stream.Length; i++) sb.AppendFormat("{0:x2}", stream[i]);
                return sb.ToString();
            }
        }
    }


    y este el contralador del login donde se accesa

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace PaginaWebEscuela.Controllers
    {
        public class AccesoController : Controller
        {
            // GET: Acceso
            public ActionResult Login()
            {
                return View();
            }
    
            [HttpPost]
            public ActionResult Login(string User, string Pass)
            {
                try
                {
                    using (Models.EscuelaDBEntitiesUsuarios db = new Models.EscuelaDBEntitiesUsuarios())
                    {
                        var oUser = (from d in db.usuario
                                     where d.email == User.Trim() && d.password == Pass.Trim()
                                     select d).FirstOrDefault();
    
                        if (oUser == null)
                        {
                            ViewBag.Error = "Usuario o Contraseña Invalida";
                            return View();
                        }
    
                        Session["User"] = oUser;
                        Session["ValorCorreo"] = User;
    
                    }
                    return RedirectToAction("Index", "Home");
                }
                catch (Exception ex)
                {
                    ViewBag.Error = ex.Message;
                    return View();
                }
            }
    
        }
    }

    y esta es la vista del Login

        ViewBag.Title = "Login";
        Layout = "~/Views/Shared/_LayoutLogin.cshtml";
    }
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" />
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
        <link href="~/Content/StylesEscuela.css" rel="stylesheet" />
    </head>
    <body>
        <div class="login-form">
            <h2 class="text-center">Member Login</h2>
            <form action="@Url.Content("~/Acceso/Login")" method="post">
                <div class="avatar">
                    <img src="~/AppFiles/Recursos/avatar.png" alt="Avatar" />
                </div>
                <div class="form-group">
                    <div class="login-error">
                        @ViewBag.Error
                                    <br /> <br />
                                </div>
                    <input type="email" name="User" class="form-control" placeholder="Usuario" required="required" style="max-width: 320px;" />
                </div>
                <div class="form-group">
                    <input type="password" name="Pass" class="form-control input-lg" placeholder="Contraseña" required="required" style="max-width: 320px;"/>
                </div>
                <div class="form-group clearfix">
                    <label class="pull-left checkbox-inline"><input type="checkbox"> Remember me</label>
                    <button type="submit" class="btn btn-primary btn-lg pull-right">Entrar</button>
                </div>
            </form>
            <div class="hint-text">Don't have an account? <a href="#">Sign up here</a></div>
        </div>
    </body>
    </html>     
    domingo, 14 de julio de 2019 21:19
  • Hola, como te he comentado, en este método

    [HttpPost]
    public ActionResult NuevoUsuarioEditar(usuario Username,usuario model)

    Deberías primero hacer la validación del modelo recibido con ModelState.IsValid. Así antes de hacer nada verificas que el password cumple las reglas de tus anotaciones. Haz esa prueba, si quieres escribes lo siguiente y pon un punto de parada. Una vez se detenga, verifica el contenido de ModelState

    var isValid = ModelState.IsValid;


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

    domingo, 14 de julio de 2019 22:53
    Moderador
  • Hola como te han sugerido primero valida que lo que estas ingresando sea valido para las restricciones que aplicas, así mismo te comento que para tu "Login" debes de tomar los datos de bd y aplicarles encriptado para que puedas iniciar sesión correctamente.

    Por último de dejo un enlace que puede serte de ayuda.

    http://ltuttini.blogspot.com/2010/05/login-usando-password-con-hash.html

    puedes aplicarlo también para tu registro.

    Saludos.


    Luis

    lunes, 15 de julio de 2019 17:57