1、登陆认证使用WebAPI自动认证
webApi自动认证继承类:AuthorizeAttribute
自动认证类使用在控制器上
[Authentication] public class CardController : BasisController { }
主要重写二个方法
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") }; } }
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; } }
2、模型认证
webApi模型认证继承类:ActionFilterAttribute
模型认证类使用在Action上
[ModelApprove] public HttpResponseMessage boundUserPhone([FromBody]boundUserPhone boundUserPhoneModel) { }
主要重写二个方法
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") }; } }
3、自定义模型认证规则
认证规则使用在模型属性上
public class addCardLog { [Required(ErrorMessage = "卡ID不能为空")] public int card_id { get; set; } }
有一些系统自带的认证规则
所在命名空间 :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; } }
自定义规则认证
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("验证码失效或者错误"); } } } }
反射获取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; } }
源码链接: https://pan.baidu.com/s/1dEHWkut 密码: 29qr