随着移动互联网的发展,webapi的应用越来越广泛,本文是笔者总结的webapi的认证校验案例,欢迎指出

案例分为两个功能:

  1、用户登录,传入账号和密码到api服务器,然后服务器使用FormsAuthenticationTicket作为身份令牌处理

  2、正式操作数据,传入登录是服务器返回的令牌数据到api服务器,服务器对令牌进行校验返回结果信息

FormsAuthenticationTicket是微软提供给我们开发人员使用,做身份认证使用的,通过认证,我们可以把关键信息存储到服务器。

具体案例

  一、api.html页面,用于测试调用api接口

 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="Scripts/jquery-1.10.2.min.js"></script>
<script>
function Login() {
alert("数据获取中")
$.ajax({
cache: true,
type: "POST",
url: "/api/Account/Login",
data: $('#formLogin').serialize(),// 你的formid
async: false,
beforeSend: function (request) {
request.setRequestHeader("token", $("#token").val());
},
error: function (request) {
alert("Connection error");
},
success: function (data) {
alert("数据获取成功" + data["token"])
$("#token").val(data["token"]); alert($("#token").val())
}
});
}
function Work() {
alert("数据获取中")
alert($("#token").val());
$.ajax({
cache: true,
type: "POST",
url: "/api/Work/GetData",
data: $('#formWork').serialize(),// 你的formid
async: false,
beforeSend: function (request) {
request.setRequestHeader("token", $("#token").val());
},
error: function (request) {
alert(" ");
},
success: function (data) {
alert("数据获取成功")
alert(data["state"])
}
}); }
</script>
</head>
<body>
<div id="token"></div>
登录测试(Account)
<form id="formLogin" method="post">
<table>
<tr><td> loginName: </td><td><input type="text" name="loginName" /></td></tr>
<tr><td>password:</td><td><input type="text" name="password" /></td></tr>
</table>
<input type="button" onclick="Login()" value="登录" />
</form>
登录测试(Account)
<form id="formWork" method="post">
<table>
<tr><td> loginName: </td><td><input type="text" name="loginName" /></td></tr> </table>
<input type="button" onclick="Work()" value="登录" />
</form>
</body>
</html>

二、登录控制器

  

 namespace _01WebApi.Controllers
{
public class AccountController : ApiController
{
[AcceptVerbs("POST", "GET")]
public HttpResponseMessage Login([FromBody]GetDataModel getData)
{
HttpResponseMessage result;
string returnValue = "";
try
{
//生成票据
string loginName =getData.loginName;
string password = getData.password;
FormsAuthenticationTicket token = new FormsAuthenticationTicket(, loginName, DateTime.Now,
DateTime.Now.AddHours(), true, string.Format("{0}&{1}", loginName, password),
FormsAuthentication.FormsCookiePath);
//返回登录结果、用户信息、用户验证票据信息
var Token = FormsAuthentication.Encrypt(token); File.WriteAllText("d:/loginName" + "_Login.txt", Token); returnValue = "{\"token\":\"" + Token + "\"}"; result = new HttpResponseMessage { Content = new StringContent(returnValue, Encoding.GetEncoding("UTF-8"), "application/json") };//这里是去掉反斜杠再放回出去,json就只剩下双引号。
return result; }
catch (Exception ex)
{
returnValue = ex.Message.ToString().Replace("\r", "").Replace("\n", "");
}
//这里是去掉反斜杠再放回出去,json就只剩下双引号。
result = new HttpResponseMessage { Content = new StringContent(CreateMessage(, returnValue), Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}
/// <summary>
/// 返回参数
/// </summary>
/// <param name="State">状态 0 失败 1 成功</param>
/// <param name="Msg">信息</param>
/// <returns></returns>
public static string CreateMessage(int State, string Msg)
{
string str = "{\"state\":\"" + State + "\",\"msg\":\"" + Msg + "\"}";
return str;
}
}
public class GetDataModel
{ public string loginName { get; set; }
public string password { get; set; } } }

三、获取数据控制器

 namespace _01WebApi.Controllers
{
public class WorkController : ApiController
{
[AcceptVerbs("POST", "GET")]
[SupportFilter]
public HttpResponseMessage GetData([FromBody]GetDataModel getData)
{
HttpResponseMessage result;
string returnValue = "";
try
{ returnValue = "{\"state\":\"获取数据成功\"}"; result = new HttpResponseMessage { Content = new StringContent(returnValue, Encoding.GetEncoding("UTF-8"), "application/json") };//这里是去掉反斜杠再放回出去,json就只剩下双引号。
return result; }
catch (Exception ex)
{
returnValue = ex.Message.ToString().Replace("\r", "").Replace("\n", "");
}
//这里是去掉反斜杠再放回出去,json就只剩下双引号。
result = new HttpResponseMessage { Content = new StringContent(CreateMessage(, returnValue), Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}
/// <summary>
/// 返回参数
/// </summary>
/// <param name="State">状态 0 失败 1 成功</param>
/// <param name="Msg">信息</param>
/// <returns></returns>
public static string CreateMessage(int State, string Msg)
{
string str = "{\"state\":\"" + State + "\",\"msg\":\"" + Msg + "\"}";
return str;
}
}
}

四、在控制器上增加自定义特性来校验令牌数据

 namespace _01WebApi.Common
{
public class SupportFilter : AuthorizeAttribute
{
//重写基类的验证方式,加入我们自定义的Ticket验证
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) {
//url获取token
var content = actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase;
//获取用户提交的token数据,用于和服务器数据进行对比,来判定用户是否有效
string token = content.Request.Headers["token"].ToString(); if (!string.IsNullOrEmpty(token))
{
//解密用户ticket,并校验用户名密码是否匹配
if (ValidateTicket(token))
{
base.IsAuthorized(actionContext);
}
else
{
HandleUnauthorizedRequest(actionContext);
}
}
//如果取不到身份验证信息,并且不允许匿名访问,则返回未验证401
else
{
var attributes = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>();
bool isAnonymous = attributes.Any(a => a is AllowAnonymousAttribute);
if (isAnonymous) base.OnAuthorization(actionContext);
else HandleUnauthorizedRequest(actionContext);
}
} //校验用户名密码(对Session匹配,或数据库数据匹配)
private bool ValidateTicket(string encryptToken)
{
//解密Ticket,并且获取UserData的值
var strTicket = FormsAuthentication.Decrypt(encryptToken).UserData; //从Ticket里面获取用户名和密码
var index = strTicket.IndexOf("&");
string loginName = strTicket.Substring(, index);
string password = strTicket.Substring(index + ); //获取存储在服务器上面的token数据
string token = File.ReadAllText("d:/loginName" + "_Login.txt");
if (token == null)
{
return false;
}
//对比服务器中的令牌和传入的是否相等
if (token.ToString() == encryptToken)
{
return true;
} return false; }
}
}

webapi 权限控制解决方案的更多相关文章

  1. WebAPI 权限控制解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(三)

    21.1   数据服务 21.1.1基本操作功能 Phenixヾ的数据服务,提供了如下的基本操作: 功能 Type URI 参数 完整获取实体集合对象 GET api/Data 分页获取实体集合对象 ...

  2. Vue-Access-Control:前端用户权限控制解决方案

    原文地址:http://refined-x.com/2017/11/28/Vue2.0用户权限控制解决方案/ Vue-Access-Control是一套基于Vue/Vue-Router/axios 实 ...

  3. SAAS云平台搭建札记: (三) AntDesign + .Net Core WebAPI权限控制、动态菜单的生成

    我们知道,当下最火的前端框架,非蚂蚁金服的AntDesign莫属,这个框架不仅在国内非常有名,在国外GitHub上React前端框架也排名第一.而且这个框架涵盖了React.Vue.Angular等多 ...

  4. .net core 同时实现网站管理员后台、会员、WebApi登录及权限控制

    我们在开网站信息系统时,常常有这样几个角色,如后台的管理员,前台的会员,以及我们各种应用的WebAPI 都需要进行登录操作及权限控制,那么在.net core如何进行设计呢. 首先我使用的是.net ...

  5. SSAS中CUBE行权限数据级权限控制

    去年做了一个数据仓库的项目,其中涉及到了CUBE数据级权限的控制.在网上找这方面的资料,找到一个[BI] 通用数据级权限控制解决方案的实现(二):Cube中的角色设置与数据级权限控制.根据这个大牛的思 ...

  6. Taurus.MVC 2.2.3.4 :WebAPI 实现权限控制认证(及功能增强说明)

    前言: 前两天,当我还在老家收拾行旅,准备回广州,为IT连的创业再战365天时, 有网友扣上问:Taurus.MVC中如何实现认证和权限控制,最好能做个小例子. 我一不小心回了句:等回广州我再写篇文章 ...

  7. .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制

    项目背景是一个社区类的APP(求轻吐...),博主主要负责后台业务及接口.以前没玩过webAPI,但是领导要求必须用这个(具体原因鬼知道),只好硬着头皮上了. 最近刚做完权限这一块,分享出来给大家.欢 ...

  8. WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制

    .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制 项目背景是一个社区类的APP(求轻吐...),博主主要负责后台业务及接口.以前没玩 ...

  9. webapi框架搭建-安全机制(四)-可配置的基于角色的权限控制

    webapi框架搭建系列博客 在上一篇的webapi框架搭建-安全机制(三)-简单的基于角色的权限控制,某个角色拥有哪些接口的权限是用硬编码的方式写在接口上的,如RBAuthorize(Roles = ...

随机推荐

  1. js 日期加一天或者减一天,最简单方法

    通过计算一天的时间戳是多少进行换算:(new Date(new Date().getTime()-86400000)).Format("yyyy-MM-dd hh:mm:ss")

  2. C#+MVC+EF+LayUI框架的应用(附带源码和教程)

    内容: 1.该框架主要用到的技术有MVC,EF,Layer,以及Razor语法和数据库有关的操作. 2.框架二次开发(增加,删除,修改,建库,以及维护查询等) 3.框架公用库更新要求与规范 4.本框架 ...

  3. [Perl][文件操作]判断文件是否为符号链接(Unicode路径)

    Win32API::File 判断文件/文件夹是否为符号链接 Win32::Unicode 好像无法做这方面的判断,只能判断是否为目录.文件.文件是否存在. Win32API::File 则支持 Ge ...

  4. for循环 | range 对象

    # ### for循环 # 循环 遍历 迭代 # 把列表的元素一一的拿出来遍历 listvar = ["黄雄大","黄文","黄仪正",&q ...

  5. BeginEditorCommand的原理

    代码来源 :http://www.arch-pub.com/problem-about-CPropertyPage_10682271.html CWnd* pAcadWnd = CWnd::FromH ...

  6. php中递归查找父级名称

    /** * 获取所属公司 * @param array 列表 * @param $id 上级ID * @return array */ private static function get_top_ ...

  7. jmeter性能测试指标

    1.jp@gc - Actiive Threads Over Time:不同时间的活动用户数量展示(图表) 当前的时间间隔是1毫秒,在setting中可以设置时间间隔以及其他的参数 2.jp@gc - ...

  8. 虚拟机安装CentOS,网络配置

    CentOS6和CentOS7,基础配置差不多. 安装CentOs6,过程:略: 安装完成后,系统默认启用动态ip,每次重启主机IP可能就会变化,搭配Xftp和Xshell工具会很难受,因此设置静态I ...

  9. easyui里面的API=====》 load

    在easyui里面有个API load,这个API实用性质很强,可以直接帮我加载页面的数据到想需要的相应输入框里面,但是也要注意,这些将要被填入数据的输入框里面的属性有个要求:其中输入框里面的name ...

  10. WebStorm 2017 激活方法

    https://www.cnblogs.com/woaic/p/6024975.html 注册时,在打开的License Activation窗口中选择“License server”,在输入框输入下 ...