博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于.Net WebAPI数据认证(包括登陆认证、模型认证)
阅读量:4623 次
发布时间:2019-06-09

本文共 6429 字,大约阅读时间需要 21 分钟。

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

   webApi自动认证继承类:AuthorizeAttribute

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

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

    主要重写二个方法

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

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

///     /// 自动认证 作者KAI    ///     public class Authentication : AuthorizeAttribute    {        ///         /// 自动认证        ///         ///         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);                //认证失败调用            }        }        ///         /// 错误返回        ///         ///         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 认证失败的错误返回

///     /// 模型字段认证 作者KAI    ///     public class ModelApprove : ActionFilterAttribute    {        ///         /// 模型认证        ///         ///         public override void OnActionExecuting(HttpActionContext actionContext)        {            //模型认证不通过            //actionContext.ModelState.IsValid 模型认证是否通过根据模型的规则 自动认证            if (!actionContext.ModelState.IsValid)            {                this.ErrorRequest(actionContext);            }        }        ///         /// 错误返回        ///         ///         protected void ErrorRequest(HttpActionContext actionContext)        {            //获取全部的错误模型认证错误的内容全在这个List内            List
errorList = new List
(); 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

///     /// 验证码检查规则    ///     public class VerifyCodeCheck : ValidationAttribute    {        public string phoneString { get; set; }        ///         /// 检查是否通过认证        ///         ///         /// 
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对象的公共属性和值

///         /// 对象转Map集合 利用反射        ///         /// 
///
public static Dictionary
objectToMap(object obj) { try { if (obj == null) throw new Exception(); Dictionary
map = new Dictionary
(); 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

转载于:https://www.cnblogs.com/zhouyukai/p/7448160.html

你可能感兴趣的文章
JS判断手机浏览器
查看>>
@Autowired和@Resource的区别
查看>>
TCP、UDP、HTTP、SOCKET之间的区别
查看>>
根据Buffer中的图片数据进行图片呈现的方法.
查看>>
用Python编写WordCount程序任务
查看>>
AC日记——传纸条 洛谷 P1006
查看>>
Android Gradle 多Module单独编译一个Module
查看>>
React显示文件夹中SVG
查看>>
编码规范小结
查看>>
695. Max Area of Island
查看>>
(转)Cortex-M3 (NXP LPC1788)之SDRAM操作
查看>>
201671010437 王小倩+词频统计软件项目报告
查看>>
python中的变量,字符串,用户交互,if语句
查看>>
django的模板文件需要为utf-8无bom格式
查看>>
linux 下查看文件修改时间,访问时间,状态改变时间
查看>>
Math类函数总结
查看>>
701 C. They Are Everywhere
查看>>
D. Too Easy Problems
查看>>
HDU 1394
查看>>
poj 1321
查看>>