• 关于.Net WebAPI数据认证(包括登陆认证、模型认证)


    1、登陆认证使用WebAPI自动认证

       webApi自动认证继承类:AuthorizeAttribute

        自动认证类使用在控制器上

        [Authentication]
        public class CardController : BasisController
        {
        }
    View Code

        主要重写二个方法

          1、OnAuthorization 在认证的时候自动调用这个方法

          2、HandleUnauthorizedRequest 认证失败的时候调用这个方法          

        /// <summary>
        /// 自动认证 作者KAI
        /// </summary>
        public class Authentication : AuthorizeAttribute
        {
            /// <summary>
            /// 自动认证
            /// </summary>
            /// <param name="actionContext"></param>
            public override void OnAuthorization(HttpActionContext actionContext)
            {
                //actionContext当前请求的HttpActionContext 可以获取请求的内容
                //actionContext.Response
                //actionContext.Request
                //actionContext.RequestContext
    
                //也可以这样获取
                //System.Web.HttpContext.Current.Request
                //System.Web.HttpContext.Current.Response
                if (true)
                {
                    //成功以后不使用session如何把数据传到对应的Action 设置当前请求的User对象就行了 Action里面有User直接可以用
                    // HttpContext.Current.User = new UserModel() { loginUser = new_user }; //设置当前登陆人模型 UserModel是自定义模型
                    base.IsAuthorized(actionContext);
                    //认证成功调用 接下来会到具体的action里面运行 
                }
                else
                {
                    this.HandleUnauthorizedRequest(actionContext);
                    //认证失败调用
                }
    
            }
            /// <summary>
            /// 错误返回
            /// </summary>
            /// <param name="actionContext"></param>
            protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
            {
                JsonData jsonData = new JsonData();
                jsonData.state = "400";
                jsonData.message = "亲!你还没登陆哪";
                actionContext.Response = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StringContent(JsonHelper.ObjectToJSON(jsonData), Encoding.UTF8, "application/json")
                };
            }
        }
    View Code

        UserModel模型我用于传递数据到具体的Action

          使用 HttpContext.Current.User = new UserModel() { loginUser = new_user }; //设置当前登陆人模型

       public class UserModel : IPrincipal
        {
            public er_wx_user loginUser { get; set; }
            public bool IsInRole(string name)
            {
                return true;
            }
            public IIdentity Identity { get; set; }
        }
    View Code   

    2、模型认证

        webApi模型认证继承类:ActionFilterAttribute

        模型认证类使用在Action上  

       [ModelApprove]
    
            public HttpResponseMessage boundUserPhone([FromBody]boundUserPhone boundUserPhoneModel)
            {
            }    
    View Code

         主要重写二个方法

           1、OnActionExecuting 模型认证的时候自动调用 webApi上如果用模型接收数据则会自动认证

           2、ErrorRequest 认证失败的错误返回

    /// <summary>
        /// 模型字段认证 作者KAI
        /// </summary>
        public class ModelApprove : ActionFilterAttribute
        {
            /// <summary>
            /// 模型认证
            /// </summary>
            /// <param name="actionContext"></param>
            public override void OnActionExecuting(HttpActionContext actionContext)
            {
    
                //模型认证不通过
                //actionContext.ModelState.IsValid 模型认证是否通过根据模型的规则 自动认证
                if (!actionContext.ModelState.IsValid)
                {
                    this.ErrorRequest(actionContext);
                }
            }
    
            /// <summary>
            /// 错误返回
            /// </summary>
            /// <param name="actionContext"></param>
            protected void ErrorRequest(HttpActionContext actionContext)
            {
                //获取全部的错误模型认证错误的内容全在这个List内
                List<string> errorList = new List<string>();
                foreach (var value in actionContext.ModelState.Values)
                {
                    foreach (var error in value.Errors)
                    {
                        errorList.Add(error.ErrorMessage);
                    }
                }
                //下面是错误返回 和自动认证一样写法
                JsonData jsonData = new JsonData();
                jsonData.state = "300";
                jsonData.message = errorList.FirstOrDefault();
                jsonData.backData.Add("info", errorList);
                actionContext.Response = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StringContent(JsonHelper.ObjectToJSON(jsonData), Encoding.UTF8, "application/json")
                };
            }
        }
    View Code

    3、自定义模型认证规则

        认证规则使用在模型属性上

      public class addCardLog
        {
            [Required(ErrorMessage = "卡ID不能为空")]
            public int card_id { get; set; }
    
        }
    View Code

        有一些系统自带的认证规则

        所在命名空间 :using System.ComponentModel.DataAnnotations;

      

       public class addInfo
        {
            [Required(ErrorMessage = "内容不能为空")]
            [StringLength(10, MinimumLength = 1, ErrorMessage = "长度范围1-10")]
            [Range(typeof(string), "1", "2", ErrorMessage = "类型为1或者2")]
            [RegularExpression(@"^1(3|4|5|7|8)d{9}$", ErrorMessage = "正则表达式认证错误内容")]
            [Compare("name_two",ErrorMessage ="二次名字不一致")]//内容是否和name_two一样多在认证二次密码 输入是否一致
            public string name { get; set; }
            public string name_two { get; set; }
        }
    View Code

         自定义规则认证

          webApi模型认证自定义规则继承类:ValidationAttribute

        主要重写一个方法

          1、IsValid

        /// <summary>
        /// 验证码检查规则
        /// </summary>
        public class VerifyCodeCheck : ValidationAttribute
        {
    
            public string phoneString { get; set; }
    
            /// <summary>
            /// 检查是否通过认证
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            protected override ValidationResult IsValid(object value, ValidationContext validationContext)
            {
                try
                {
                    //value 是认证的属性的值
                    //validationContext.ObjectInstance 是当前模型的object 对象可以用反射获取值 
                    //可能在认证的时候需要别值参与 objectToMap方法把 object对象变成键值对对象
                    var phone = CommonHelper.objectToMap(validationContext.ObjectInstance)[phoneString].ToString();
                    if (CacheHelper.Get(phone).ToString().Equals(value.ToString()))
                    {
                        return ValidationResult.Success;
                    }
                    return new ValidationResult(base.ErrorMessage);
                }
                catch
                {
                    return new ValidationResult("验证码失效或者错误");
                }
    
            }
        }
    }
    View Code

           反射获取object对象的公共属性和值

       /// <summary>
            /// 对象转Map集合 利用反射
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <returns></returns>
            public static Dictionary<string, object> objectToMap(object obj)
            {
                try
                {
    
                    if (obj == null) throw new Exception();
                    Dictionary<string, object> map = new Dictionary<string, object>();
                    foreach (var attribute in obj.GetType().GetProperties()) //反射获取属性列表
                    {
                        map.Add(attribute.Name, attribute.GetValue(obj));
    
                    }
                    return map;
                }
                catch
                {
    
                    return null;
                }
            }
    View Code

     源码链接: https://pan.baidu.com/s/1dEHWkut 密码: 29qr

  • 相关阅读:
    LM NTML NET-NTLM2理解及hash破解
    HTML转义字符&url编码表
    ZooKeeper未授权漏洞
    阉割版BBBlack安装Debian
    在ANTMINER(阉割版BeagleBone Black)运行Debain
    Ubuntu/Debian下通过Apt-get简单安装Oracle JDK
    [Linux]几个armhf的ubuntu源
    [Ubuntu]管理开机启动项的软件
    CentOS搭建NFS服务
    [C#]SharpSSH-一个可以使用SSH连接的.NET库
  • 原文地址:https://www.cnblogs.com/zhouyukai/p/7448160.html
Copyright © 2020-2023  润新知