1、登陸認證使用WebAPI自動認證 webApi自動認證繼承類:AuthorizeAttribute 自動認證類使用在控制器上 [Authentication] public class CardController : BasisController { } 主要重寫二個方法 1、OnAutho ...
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