随着移动互联网的发展,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. 关于Git的那些事

    以前一直使用tfs 或者svn当做代码管理器,随着GitHub的越来越火,git的使用人说也越来越多,这不我也开始来折腾git .GitHub的连接速度有的时候很慢,在国内不是太稳定,正好看到开源中国 ...

  2. Spring Boot - Spring Async

    除了使用Thread.Runnable.TimerTask.FeatureTask.CompletableFuture等类,在Spring Boot中还可以使用注解创建异步任务,可以减少线程处理的代码 ...

  3. Django Meta

    Available Meta options abstract 如果为True,这个model就是抽象类 app_label 如果模型是在INSTALLED_APPS中的应用程序之外定义的,它必须声明 ...

  4. 知物由学 | 如何利用人工智能来对抗DDoS攻击?

    欢迎访问网易云社区,了解更多网易技术产品运营经验. "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理 ...

  5. CharSequence与String的区别

    CharSequence与String都能用于定义字符串,但CharSequence的值是可读可写序列,而String的值是只读序列. 原文: http://blog.csdn.net/joy_zha ...

  6. HTTP响应状态码参考

    HTTP响应状态码参考: 1xx:信息 Continue 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求. Switching Protocols 服务器转换协议 ...

  7. 原生态js展开高度自适应100%

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Linux系统管理 常用命令

    基础常用命令 某个命令 --h,对这个命令进行解释 某个命令 --help,解释这个命令(更详细) man某个命令,文档式解释这个命令(更更详细)(执行该命令后,还可以按/+关键字进行查询结果的搜索) ...

  9. “全栈2019”Java第十六章:下划线在数字中的意义

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. python爬虫urllib库使用

    urllib包括以下四个模块: 1.request:基本的HTTP请求模块,可以用来模拟发送请求.就像在浏览器里输入网址然后回车一样,只需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程. ...