Formularios de validación de formularios en MVC y la realización del interceptor ActionFilterAttribute

Prefacio

Mecanismo de autenticación y autorización La
autenticación es el proceso de determinar la identidad de un usuario. Una vez que el usuario está autenticado, el desarrollador
puede determinar si el usuario tiene derecho a continuar con la operación. Sin autenticación, la
entidad no puede ser autorizada.
La autorización es para determinar si el usuario autenticado tiene derecho a acceder a una determinada parte de la aplicación, a un determinado
punto o solo a un conjunto específico de datos proporcionados por la aplicación.

Hoy compartiré sobre la verificación de inicio de sesión de formularios en .NET MVC y la interceptación de roles ActionFilterAttribute. Hay dos formas de iniciar sesión.
La primera es: envío de formularios.
El segundo: envío asíncrono Ajax. No hay mucho que decir, solo ve al código.

Diagrama de flujo de resumen de inicio de sesión

Inserte la descripción de la imagen aquí

Configuración de Web.Config

(1) Agregue un nodo de autenticación en el nodo system.web en la configuración web.Config .

(2) Modo: ASP.NET admite 3 métodos de autorización
                     ● Windows : autenticación IIS. Muy útil en un entorno de intranet.
                     ● Pasaporte : autenticación centralizada de Microsoft, un usuario puede acceder a todos los
sitios de los miembros y se requieren cargos.
                     ● Formularios : verificación de formulario, verificación de cuenta / contraseña, el mejor y más popular
método de verificación para la programación web .
                     Aquí elegimos Formularios de validación de formularios.

(3) Acerca de los atributos usados ​​en el nodo Formularios :
          ● nombre: es el nombre que se le da a la cookie para guardar al usuario entre solicitudes, el valor predeterminado es .Aspxauth
          ● loginurl: la página que necesita ser procesada para la autenticación. Estamos aquí para ocuparnos de la página de inicio de sesión. Si no se encuentra una cookie de verificación válida, especifique la URL de
          Redingxi. ● tiempo de espera: especifique el tiempo (minutos) para que caduque la cookie. El tiempo de caducidad se especifica aquí como 20 minutos.

 <system.web>
         <authentication mode="Forms">
             <forms name="auth" loginUrl="/Account/Login"   timeout="20" > </forms>
        </authentication>
  </system.web>

Vista de inicio de sesión

(1) Lo que debe prestar atención al formulario en la vista es la dirección de envío de la acción. Además, en el controlador, si se especifica el método de envío, preste atención al método de envío del método. Y debería usar post. Existe el valor del atributo de nombre de la casilla de usuario y la casilla de contraseña. El nombre del parámetro pasado es el valor de nombre relevante.

  <form class="layui-form" id="form" action="/Account/Login" method="post">
                    <label class="layui-form-label" >用户名</label>
                    <input type="text" name="LoginId" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" >
                    <label class="layui-form-label">密码</label>
                    <input type="password" name="LoginPWD" required lay-verify="required" placeholder="请输入密码" autocomplete="off" >
                    @*方式一,表单提交*@
                    <button class="layui-btn lg_btn" type="submit" lay-submit lay-filter="formDemo">立即登录</button>
  </form>

Inicie sesión en el controlador

(1) A través del nombre de usuario y la contraseña ingresados ​​por el usuario de la vista, la clase de entidad de la tabla de usuario en la base de datos para consultar y devolver información personal.

(2) Determinar si el estado del individuo está resignado

(3) Cuando la contraseña de inicio de sesión sea correcta y el estado personal esté activo, comience a crear una factura. FormsAuthenticationTicket. Los parámetros son: número de versión, nombre de usuario, fecha de creación del ticket, hora de vencimiento del ticket, si se continúa con el ticket, datos definidos por el usuario.

(4) El UserData en el ticket FormsAuthenticationTicket solo puede poner el tipo de cadena, si queremos almacenar el objeto de usuario en él. Puede serializar objetos en cadenas de formato json. Si desea usarlo, simplemente deserialícelo.

(5) Autenticación de formularios. Encriptar es el método utilizado para encriptar la factura recién creada. Utilice el ticket para generar cookies y guardarlas en Cookies. Tenga en cuenta que la clave de la cookie se refiere al nombre del formulario de autenticación FormsAuthentication.FormsCookieName

(5) Página de salto, aquí está la página de índice de empleados.

        [HttpPost]
        public ActionResult Login(string LoginId, string LoginPWD)
        {
    
    
                                                //MD5加密
            LoginPWD = Converters.ToolMD5Encrypt(LoginPWD);
            employee employee = new employee();
            employee.Login_name = LoginId;
            employee.Login_pwd = LoginPWD;
            if (ES.LoginVilidate(employee) != null)
            {
    
    
                //通过输入的用户名和密码进行数据库匹配并返回实体信息
                employee SuccesEntity = ES.LoginVilidate(employee);
                if (SuccesEntity.Status == "1")
                {
    
    
                    ViewBag.LoginMesssage = "用户不存在";
                }
                else
                {
    
    
                    //创建一个授权对象类  存储相关信息
                    Authinfor AuthEntity = new Authinfor {
    
     Emp_id = SuccesEntity.Emp_id, Name = SuccesEntity.Name, Roles_name = SuccesEntity.Roles_name };
                    //序列化授权对象类,用于放入票据中的用户自定义事件
                    string userDataJson = JsonConvert.SerializeObject(AuthEntity);
                    FormsAuthenticationTicket Tick = new FormsAuthenticationTicket(
                      1,                                                                    //版本号
                      SuccesEntity.Name,                                                    //用户名
                      DateTime.Now,                                                         //创建票据日期
                      DateTime.Now.AddMinutes(FormsAuthentication.Timeout.TotalMinutes),    //票据持续时间
                      false,                                                                //是否持久性
                     userDataJson);                                                         //用户自定义存储数据
                    string eny = FormsAuthentication.Encrypt(Tick);                         //对创建好了的票据进行加密
                    //将票据保存在
                    HttpCookie HK = new HttpCookie(FormsAuthentication.FormsCookieName, eny);
                    Response.Cookies.Add(HK);
                    return Redirect("/Employees/index");
                }
            }
            else
            {
    
    
                ViewBag.LoginMesssage = "登录失败";
            }
            return View();
        }

Nota: Estoy aquí porque al registrar a un empleado, la contraseña se almacena en la base de datos mediante encriptación MD5. Por lo tanto, al juzgar si la contraseña ingresada por el empleado es correcta, es necesario volver a cifrar el formato unificado en ambos lados con MD5, y luego consultar la información relevante en la base de datos.

        /// <summary>
        /// MD5加密
        /// </summary>
        /// <param name="value">要加密的字符串</param>
        /// <returns>加密好的字符串</returns>
        public static string ToolMD5Encrypt(string value)
        {
    
    
            try
            {
    
    
                MD5 md5 = new MD5CryptoServiceProvider();
                byte[] btSource = System.Text.Encoding.Default.GetBytes(value);
                byte[] btResult = md5.ComputeHash(btSource);
                string encryptData = "";
                for (int i = 0; i < btResult.Length; i++)
                {
    
    
                    encryptData += btResult[i].ToString("X");
                }
                return encryptData;
            }
            catch (Exception ex)
            {
    
    
                throw ex;
            }
        }

Luego, lo anterior completa el proceso de verificación del formulario. Lo siguiente a tener en cuenta es. ¿Qué página de vista debe autenticarse antes de poder acceder a ella? Simplemente agregue el logotipo [Autorizar].

(1) En el controlador de inicio de sesión, se me redirige a la página de índice del empleado después de que la autenticación es exitosa. Así que agregué una marca de certificación en el controlador de índice de empleados.

        // GET: Employees
        [CheckFilter("经理")]
        [Authorize]
        public ActionResult Index()
        {
    
    
            return View();
        }

(2) La interceptación de roles se completará a continuación. En otras palabras, ningún empleado puede acceder a todas las páginas.

(3) Cree una nueva clase con un nombre de clase personalizado, y aquí está CheckFilter.

(4) Interceptor personalizado, heredar y heredar la clase abstracta ActionFilterAttribute, reescribir los métodos requeridos y mirar la firma del método y reescribir la clase ActionFilterAttribute.
     ● OnActionExecuting: el método virtual que se procesará al ingresar a la Acción, donde la solicitud de Solicitud recibida puede ser procesada o interceptada.
     ● OnActionExecuted: ingresó Action, aquí puede continuar procesando algo o interceptarlo.
     ● OnResultExecuting: antes de responder a Result, puede continuar procesando algo o interceptarlo.
     ● OnResultExecuted: Después de responder a Result, puede continuar procesando algo o interceptarlo.

Clase de interceptor personalizada

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using Newtonsoft.Json;
using Model.BusinessMsage;
namespace TestHoses.Code
{
    
    
 public class CheckFilter : ActionFilterAttribute
 {
    
    
     protected string Roles {
    
     get; set; }
     protected bool IsAjaxs {
    
     get; set; }

     /// <summary>
     /// 构造函数
     /// </summary>
     /// <param name="roles"></param>
     /// <param name="ajaxs"></param>
     public CheckFilter(string roles="", bool ajaxs = false)
     {
    
    
         Roles = roles;
         IsAjaxs = ajaxs;
     }


     public override void OnActionExecuting(ActionExecutingContext filterContext)
     {
    
    
         //判断当前请求类型是否为Ajax请求
         if (filterContext.HttpContext.Request.IsAjaxRequest())
         {
    
    
             this.IsAjaxs = true;
         }
     }


     public override void OnActionExecuted(ActionExecutedContext filterContext)
     {
    
    
         //获取当前验证成功票据中的用户自定义数据
         string userData = ((FormsIdentity)filterContext.HttpContext.User.Identity).Ticket.UserData;
         //反序列化获取对象
         Authinfor authinfor = JsonConvert.DeserializeObject<Authinfor>(userData);
         if (!authinfor.Roles_name.Split(',').Contains(Roles))
         {
    
    
             if (!IsAjaxs)
             {
    
    
                 filterContext.HttpContext.Response.Redirect("/Home/Error");
             }
             else
             {
    
    
                 filterContext.HttpContext.Response.Write("{\"meeage:\"你没权限\"}");
                 filterContext.HttpContext.Response.End();
             }
         }
         else {
    
    
             if (IsAjaxs) {
    
    
                 
                 filterContext.HttpContext.Response.Write("{\"meeage:\"true\"}");
                 filterContext.HttpContext.Response.End();
             }
         }
     }
 }
}

(1) Encapsular atributos de campo, nombres de roles, ya sea una solicitud ajax

(2) Antes de que se ejecute la acción, juzgue Request.IsAjaxRequest () para determinar si se trata de una solicitud AJax.

(3) Después de ejecutar la acción, primero obtenga la información de autorización actual. Es decir, el userData almacenado en el ticket. Antes de almacenarlo, lo serializamos, por lo que debemos deserializarlo nuevamente al leerlo.

(4) Determine si el rol del usuario es legal y si es una solicitud Ajax.

(5) ¿Por qué es necesario juzgar si se trata de una solicitud ajax? Porque cuando queremos interceptar el procesamiento, necesitamos redirigir a otras direcciones de página y decirle al usuario que no tiene permiso para acceder. Ajax es una actualización parcial y la dirección de redirección Response.Redirect () no es válida para ella. Por lo tanto, necesitamos determinar el tipo de solicitud y manejar algunas cosas de acuerdo con el tipo de solicitud. Si se trata de una solicitud Ajax, se devuelve la información o el estado especificados y el js del front-end se procesa de acuerdo con la información o el estado especificados. Si no es una solicitud Ajax, redirigirá directamente la dirección de la página relevante y dará un mensaje.

Supongo que te gusta

Origin blog.csdn.net/WenRouDG/article/details/107929082
Recomendado
Clasificación