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 = "";
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 = "";
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(, MinimumLength = , ErrorMessage = "长度范围1-10")]
[Range(typeof(string), "", "", 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

关于.Net WebAPI数据认证(包括登陆认证、模型认证)的更多相关文章

  1. C#进阶系列——WebApi 身份认证解决方案:Basic基础认证

    前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...

  2. WebApi身份认证解决方案:Basic基础认证

    前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...

  3. C#进阶系列——WebApi身份认证解决方案:Basic基础认证 (转)

    http://www.cnblogs.com/landeanfen/p/5287064.html 前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人 ...

  4. WebApi 身份认证解决方案:Basic基础认证

    前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...

  5. (转)C# WebApi 身份认证解决方案:Basic基础认证

    原文地址:http://www.cnblogs.com/landeanfen/p/5287064.html 阅读目录 一.为什么需要身份认证 二.Basic基础认证的原理解析 1.常见的认证方式 2. ...

  6. #进阶系列——WebApi 身份认证解决方案:Basic基础认证

    阅读目录 一.为什么需要身份认证 二.Basic基础认证的原理解析 1.常见的认证方式 2.Basic基础认证原理 三.Basic基础认证的代码示例 1.登录过程 2./Home/Index主界面 3 ...

  7. ASP.NET WebApi 基于OAuth2.0实现Token签名认证

    一.课程介绍 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将是我们需要思考的问题.为了保护我们的WebApi数 ...

  8. ASP.NET Core WebApi基于Redis实现Token接口安全认证

    一.课程介绍 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebSer ...

  9. 频率类组件-认证规图分析-JWT认证-drf-jwt插件

    频率类源码 # 1)APIView的dispath方法中的 self.initial(request, *args, **kwargs) 点进去 # 2)self.check_throttles(re ...

随机推荐

  1. 识别子串 (string)——后缀自动机+线段树

    题目 [题目描述] 一般地,对于一个字符串 S,和 S 中第 $ i $ 个字符 x,定义子串 $ T=S(i.j) $ 为一个关于 x 的识别子申,当且仅当: 1.$ i \leq x \leq j ...

  2. 这些年、我收集的JQuery代码 (转)

    1. 如何创建嵌套的过滤器 //允许你减少集合中的匹配元素的过滤器, //只剩下那些与给定的选择器匹配的部分.在这种情况下, //查询删除了任何没(:not)有(:has) //包含class为“se ...

  3. P2948 [USACO09OPEN]滑雪课Ski Lessons

    题意:Bessie去滑雪,限时T,滑雪场有S节课 每节课开始于$m_i$,长度为$l_i$,可以将Bessie的能力值变成$a_i$(注意是变成不是增加) 有n个滑雪坡,去滑雪需要$c_i$的能力,并 ...

  4. SQL 模糊查询 可以正则匹配 (转)

    1. % 表示任意0个或多个字符.如下语句:Select * FROM user Where name LIKE '%三%'; 将会把name为“张三”,“三脚猫”,“唐三藏”等等有“三”的全找出来. ...

  5. PAT天梯赛 L1-050 倒数第N个字符串

    题目链接:点击打开链接 给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增.例如当 L 为 3 时,序列为 { aaa, ...

  6. UICollectionView Layout自定义 Layout布局

    from:   http://www.tuicool.com/articles/vuyIriN 当我们使用系统自带的UICollectionViewFlowLayout无法实现我们的布局时,我们就可以 ...

  7. P4159 [SCOI2009]迷路

    传送门 先考虑只有 01 边权的情况 显然可以DP+矩阵加速 但是现在边权不止 1 然鹅最大也只有 9 所以从这里入手,把点拆成 9 个,然后点之间的边权也就可以变成 1 了 同样的转移和矩阵加速 注 ...

  8. B. Sereja and Suffixes

    B. Sereja and Suffixes time limit per test 1 second memory limit per test 256 megabytes input standa ...

  9. day 006 小数据池和再谈编码

    1.小数据池. 目的:缓存我们的字符串,整数,布尔值.在使用的时候不需要创建过多的对象 缓存: int str bool int 范围:-5~256 str: 1.长度小于等于1,直接缓存 2.长度大 ...

  10. XtraFinder

    About System Integrity Protection in OS X 10.11 Apple's article . System Integrity Protection blocks ...