随着移动互联网的发展,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. consul ACL2

    简介 Consul有多个组件,但是整体上,consul通常作为服务发现工具来使用. Consul主要由以下特点: 服务发现 健康检查 KV存储 多数据中心 Consul一般与zookeeper,ser ...

  2. 接口文档神器Swagger(上篇)

    本文来自网易云社区 作者:李哲 接口文档管理一直是一个让人头疼的问题,伴随着各种接口文档管理平台涌现,如阿里开源的rap,ShowDoc,sosoapi,等等(网上能找到很多这种管理平台,包括我们自己 ...

  3. bzoj1059矩阵游戏

    题目链接 矩阵快速幂+二分图匹配, 对于对角线上的每个点看看能不能换到就行, 但是一开始$dicnic$写挂了 只好写的匈牙利 /*********************************** ...

  4. python3入门之函数

    相信大家学习过其他语言,懂得函数的作用.简单的说函数最好的作用就是可以使程序变得懒惰.python作为后起之秀,当然也会拥有函数这个有用的东西: 创建函数 使用def语句即可创建函数,如创建一个用来生 ...

  5. 条目二十四《当效率至关重要时,请在map::operator[]与map::insert之间谨慎做出选择》

    条目二十四<当效率至关重要时,请在map::operator[]与map::insert之间谨慎做出选择> 当效率至关重要时,应该在map::operator[]和map::insert之 ...

  6. leetcode-575-Distribute Candies(计算一个数组中元素的种类的快速方法)

    题目描述: Given an integer array with even length, where different numbers in this array represent diffe ...

  7. 0、PlayGround可视化

    Tensorflow新手通过PlayGround可视化初识神经网络 是不是觉得神经网络不够形象,概念不够清晰,如果你是新手,来玩玩PlayGround就知道,大神请绕道. PlayGround是一个在 ...

  8. 阿里云redisA迁移redisB迁移

    ./redis-port restore --input=./xxx.rdb --target=r-2zedc7c8e0557dsf4.redis.rds.aliyuncs.com:6379 --au ...

  9. flutter dup get

    有很多 flutter library 中有两种导入方式 with dup: dup get 这种导入方式是需要依赖于 Dart SDK 下载 Dart SDK 地址:http://www.gekor ...

  10. Leo-io 的C语言实现简单五子棋游戏观后感

    源代码: /************************************************************** ** 文 件 名:wuziqi.cpp ** 功    能:扫 ...