关于.Net WebAPI数据认证(包括登陆认证、模型认证)
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数据认证(包括登陆认证、模型认证)的更多相关文章
- C#进阶系列——WebApi 身份认证解决方案:Basic基础认证
前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...
- WebApi身份认证解决方案:Basic基础认证
前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...
- C#进阶系列——WebApi身份认证解决方案:Basic基础认证 (转)
http://www.cnblogs.com/landeanfen/p/5287064.html 前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人 ...
- WebApi 身份认证解决方案:Basic基础认证
前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...
- (转)C# WebApi 身份认证解决方案:Basic基础认证
原文地址:http://www.cnblogs.com/landeanfen/p/5287064.html 阅读目录 一.为什么需要身份认证 二.Basic基础认证的原理解析 1.常见的认证方式 2. ...
- #进阶系列——WebApi 身份认证解决方案:Basic基础认证
阅读目录 一.为什么需要身份认证 二.Basic基础认证的原理解析 1.常见的认证方式 2.Basic基础认证原理 三.Basic基础认证的代码示例 1.登录过程 2./Home/Index主界面 3 ...
- ASP.NET WebApi 基于OAuth2.0实现Token签名认证
一.课程介绍 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将是我们需要思考的问题.为了保护我们的WebApi数 ...
- ASP.NET Core WebApi基于Redis实现Token接口安全认证
一.课程介绍 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebSer ...
- 频率类组件-认证规图分析-JWT认证-drf-jwt插件
频率类源码 # 1)APIView的dispath方法中的 self.initial(request, *args, **kwargs) 点进去 # 2)self.check_throttles(re ...
随机推荐
- Mybatis+maven自动构建dao、mapper、model
1.Pom.xml文件配置: 代码: <plugins> <!-- Mybatis generator代码生成插件 配置 --> <plugin> <grou ...
- Cardinality (基数)
名词 Cardinality: 优化器在计算成本的时候,需要从统计信息中取得数据,然后去估计每一步操作所涉及的行数,叫做Cardinality. 比如,一张表T有1000行数据,列COL1 ...
- 在PowerShell中操作SharePoint对象
1. 用PowerShell创建一个SharePoint内容对象创建一个自定义列表:$SPSite = New-Object Microsoft.SharePoint.SPSite("htt ...
- 用勤哲excel服务器开发旅行社管理软件
做这个旅行社管理软件之前,旅行社给我的印象就是“拉客”与“接客”,业务模式应该比较简单.但做起这样一个旅行社管理软件,才发现麻雀虽小.五脏俱全,一个旅行社的运作,牵扯到的方方面面远远超出自己之前的理解 ...
- wordpress显示FTP上传
在开始添加的配置文件里添加以下内容 define("FS_METHOD","direct"); define("FS_CHMOD_DIR", ...
- 07. 如何实现移动端rem适配
如何实现移动端rem适配 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- python统计字符串中字符个数
str = "xxx" result = {} for i in set(str):#set将字符串转为集合对象,用于去重,减少计算量 result[i] = str.count( ...
- P4345 [SHOI2015]超能粒子炮·改
传送门 看到数据和模数大小就知道要上 lucas 了 然后开始愉快地推公式: 答案为 $\sum _{i=0}^kC_{n}^{i}\ (mod\ 2333)$ 设 $f [ i ] [ j ] = ...
- Java的JsonHelper
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency> <g ...
- 线段树 区间更新(更新区间[x,y]的值,再求任意区间[x,y]的和)
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...