关于.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 ...
随机推荐
- java24种设计模式
一.设计模式定义 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式是为了可重用代码.让代码更容易被他人理解并且保证代码可靠性. ...
- scikit-learn 机器学习库
一 介绍 scikit-learn是Python的一个开源机器学习模块,它建立在NumPy,SciPy和matplotlib模块之上.值得一提的是,scikit-learn最先是由David Cour ...
- CentOS6.5上Zabbix3.0的RPM安装【二】-汉化
六.汉化 zabbix实际是有中文语言的,我们可以通过修改web端源文件来开启中文语言.首先点击zabbix监控页面右上角管理员头像进入“用户基本资料设置页面“. 选择中文语言. 点击“Update” ...
- SysPeek打不开解决方法
SysPeek 是Linux平台下一款简洁小巧的系统状态指示软件,可实时显示 CPU.Memory.Swap.硬盘和网络使用情况.然而最近却使用不了,打不开.无论点击图标或者是终端打开,都不显示.看错 ...
- Leetcode 566. Reshape the Matrix 矩阵变形(数组,模拟,矩阵操作)
Leetcode 566. Reshape the Matrix 矩阵变形(数组,模拟,矩阵操作) 题目描述 在MATLAB中,reshape是一个非常有用的函数,它可以将矩阵变为另一种形状且保持数据 ...
- for循环删除list中多个元素出现的误区
错误的做法是: for(int i= 0;i<list.size();i++) 因为在你删除元素的同时list.size()也在变小,这样就会照成越界. 正确做法:因为要删除list里面的多个的 ...
- php 多语言(UTF-8编码)导出Excel、CSV乱码解决办法之导出UTF-8编码的Excel、CSV
新项目,大概情况是这样的:可能存在多国.不同语种使用者,比喻有中文.繁体中文,韩文.日本等等,开发时选择了UTF-8编码,开发顺利,没有问题.昨天做了一个csv导出功能,导出的东西完全乱了: 设置mb ...
- freemarker macro 使用
转载... macro, nested, return语法 <#macro name param1 param2 ... paramN>...<#nested loopvar1, l ...
- 奇妙的 CSS几何图形
三角形:通常会使用透明的border模拟出一个三角形:▲ .traingle { width:; height:; border-left: 50px solid transparent; borde ...
- http文件上传/下载
package unit; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputSt ...