随着移动互联网的发展,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. c# 与 Mysql 的通讯方式总结

    两种开发方式 1.使用 vs 自带的可视化工具,不推荐. 在 vs 的项目中添加 ‘数据集’,然后通过可视化的工具添加数据库为数据源,默认可添加 SQL Server 和 Oracle 等,添加 My ...

  2. Ocelot Consul ACL

    Ocelot允许您指定服务发现提供程序,并使用它来查找Ocelot正在将请求转发给下游服务的主机和端口.目前,这仅在GlobalConfiguration部分中受支持,这意味着所有ReRoute将使用 ...

  3. 【sonar-block】Use try-with-resources or close this "BufferedInputStream" in a "finally" clause.

    自己的理解: try-with-resources是JDK7的新语法结构,主要功能是自动关闭资源而不需要在finally里面手动close()关闭, 而且最重要的是,try块中的异常不会被close( ...

  4. [AIR] AIR将数据保存并导出为Excel

    package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.filesystem.File; ...

  5. 2016级算法第五次上机-C.Bamboo和"Coco"

    1064 Bamboo和"Coco" 分析题意 每个亡灵至少一个花瓣,相邻的亡灵中思念值高的要获得的花瓣高(思念值相等是不需要花瓣一样多的).主要考贪心思路,为了使得花瓣总量最少, ...

  6. PostMan --API调试工具

    https://blog.csdn.net/fxbin123/article/details/80428216

  7. [SCOI2018]游泳池(计算几何+分数规划+最大权闭合子图)

    题目链接 https://www.luogu.org/problemnew/show/U56187 注:题面参考了网上的其他博客,并非原题题面,因此数据范围可能有误.数据为原创数据. 题解 其实就是许 ...

  8. 233 Matrix(矩阵快速幂+思维)

    In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233 ...

  9. android 企业级高性能图表库 SciChart (付费)

    1.官网 https://www.scichart.com/ 2.特性 2.1 链接 https://www.scichart.com/android-chart-features/ https:// ...

  10. Asp.Net webconfig中使用configSections的用法

    最近闲来无事,研究研究公司的框架,无意中打开了webconfig页面,发现了一个我不认识的节点<configSections></configSections>,于是百度之,大 ...