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

2018-06-22 07:51:14来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

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

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:如何定义一个有效的OWIN Startup Class

下一篇:IIS Tomcat共享80端口