webapi 权限控制解决方案
随着移动互联网的发展,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 权限控制解决方案的更多相关文章
- WebAPI 权限控制解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(三)
21.1 数据服务 21.1.1基本操作功能 Phenixヾ的数据服务,提供了如下的基本操作: 功能 Type URI 参数 完整获取实体集合对象 GET api/Data 分页获取实体集合对象 ...
- Vue-Access-Control:前端用户权限控制解决方案
原文地址:http://refined-x.com/2017/11/28/Vue2.0用户权限控制解决方案/ Vue-Access-Control是一套基于Vue/Vue-Router/axios 实 ...
- SAAS云平台搭建札记: (三) AntDesign + .Net Core WebAPI权限控制、动态菜单的生成
我们知道,当下最火的前端框架,非蚂蚁金服的AntDesign莫属,这个框架不仅在国内非常有名,在国外GitHub上React前端框架也排名第一.而且这个框架涵盖了React.Vue.Angular等多 ...
- .net core 同时实现网站管理员后台、会员、WebApi登录及权限控制
我们在开网站信息系统时,常常有这样几个角色,如后台的管理员,前台的会员,以及我们各种应用的WebAPI 都需要进行登录操作及权限控制,那么在.net core如何进行设计呢. 首先我使用的是.net ...
- SSAS中CUBE行权限数据级权限控制
去年做了一个数据仓库的项目,其中涉及到了CUBE数据级权限的控制.在网上找这方面的资料,找到一个[BI] 通用数据级权限控制解决方案的实现(二):Cube中的角色设置与数据级权限控制.根据这个大牛的思 ...
- Taurus.MVC 2.2.3.4 :WebAPI 实现权限控制认证(及功能增强说明)
前言: 前两天,当我还在老家收拾行旅,准备回广州,为IT连的创业再战365天时, 有网友扣上问:Taurus.MVC中如何实现认证和权限控制,最好能做个小例子. 我一不小心回了句:等回广州我再写篇文章 ...
- .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制
项目背景是一个社区类的APP(求轻吐...),博主主要负责后台业务及接口.以前没玩过webAPI,但是领导要求必须用这个(具体原因鬼知道),只好硬着头皮上了. 最近刚做完权限这一块,分享出来给大家.欢 ...
- WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制
.NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制 项目背景是一个社区类的APP(求轻吐...),博主主要负责后台业务及接口.以前没玩 ...
- webapi框架搭建-安全机制(四)-可配置的基于角色的权限控制
webapi框架搭建系列博客 在上一篇的webapi框架搭建-安全机制(三)-简单的基于角色的权限控制,某个角色拥有哪些接口的权限是用硬编码的方式写在接口上的,如RBAuthorize(Roles = ...
随机推荐
- Linux下开放指定端口
今天Linux测试服务器重启了下 结果导致网站打不开了,ip也能ping通 Apache重启成功,telnet了下80端口结果连不上,这就应该是外网80被防火墙拦截了 后面把80端口开发了下可以了,步 ...
- 算法 UVA 11300
例3:题目描述 圆桌旁边坐着n个人,每个人有一定数量的金币,金币的总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数量相等.你的任务是求出被转手的金币的数量的最小值. 输入格式 ...
- Android学习之 adb被占用解决办法
1.adb被占用解决办法 方法一:(1)查看5037端口哪个进程在用 netstat -a -o 5037 (2)查看上面进程是哪个执行文件在占用 tasklist ...
- 微信小程序的onLaunch()方法和onShow()方法
在app.js里面你会发现一个onLaunch()方法,这个方法是当小程序加载完毕后就执行的方法,此外,还有一个onShow()方法,先看下面的代码 app.js //app.js App({ onL ...
- 三、linux基础命令
1.已知/tmp 目录下已经存放了test.txt文件,如何执行命令才能把/mnt/test.txt拷贝到/tmp 下覆盖掉/tmp/test.txt,而让linux系统不提示是否覆盖 答:之所以会出 ...
- OCP 12c最新考试题库及答案(071-2)
2019-02-12 16:23:54 2.(4-7) choose the best answer:You need to display the first names of all cust ...
- php面向对象编程_1
1, php面向对象编程的三大特征: (1) 封装性,封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法)才能对数据进行操作. (2) 继承 ...
- [ActionScript 3.0] 透视投影
下面的示例演示如何使用透视投影来创建 3D 空间.该示例演示如何通过projectionCenter属性来修改消失点和更改空间的透视投影.进行这种修改后,将强制重新计算focalLength和fiel ...
- 如何在Linux下禁用IPv6
如何在Linux下禁用IPv6 echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 禁用IP ...
- js计算器案例
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>j ...