一、定义概念
Token被翻译成为('令牌','标记')在计算机中的含义也差不错('计算机身份认证安全令牌'),token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。
二、传统的Seeion验证
Http协议进行数据的提交,服务器接收到用户帐号和密码进行验证,在之后的一系列操作,因为http协议本身是一种无状态的协议,再下一次请求必须重新发送一次帐号和密码来进行认证。
根据http协议我们没办法做一个长期的验证,为了让应用能够识别身份,我们需要在服务端进行身份的保存,所以使用session进行保存,这就是传统的session认证。
缺点:session保存是使用的内存,当用户量大的时候会对服务器增加很大的压力。
三、Token解决的问题
1.Token完全由应用管理,所以它可以避开同源策略.
2.Token可以避免CSRF攻击(跨域请求仿造).
3.Token可以是无状态的,可以在多个服务间共享.
Token是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么服务端会反返回Token给前端,前端可以在每次请求的时候带上Token证明自己的合法地位,如果这个Token在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌.
四、基于Token的身份验证过程
1、用户通过用户名和密码发送请求请求登录
2、程序验证用户名和密码
3、创建一个签名的Token返回给客户端
4.、客户端每次发送请求且携带Token
5、服务端验证Token
6、返回状态码
五、Token的分类
1、访问令牌(Access Tokens)是Windows操作系统安全性的一个概念。一个访问令牌包含了此登陆会话的安全信息。
2、会话令牌(Session token)用于解决表单重复提交问题;当客户端提交一次之后(也提交了token并且匹配服务器token)服务器接受成功以后将更新token所以客户端再次提交token将不再匹配
六、使用无状态的Token的时候,有两点需要注意:
1、Referesh Token有效时间较长,所以它应该在服务器端有状态,以增强安全性,确保用户注销时可控.
2、应该考虑使用二次认证来增强敏感操作的安全性.
注意:这是 --- 认证服务和业务服务集成在一起的情况
七、分离认证服务
当Token无状态之后,单点登录就变得容易了,前端拿到一个有效的Token,他就可以在任何同一体系的服务上认证通过------------只要他们使用同样的秘钥和算法来认证Token的有效性.
当然,如果 Token 过期了,前端仍然需要去认证服务更新 Token:
注意:这是建立在认证服务器信任业务服务器的前提下,因为认证服务器产生 Token 的密钥和业务服务器认证 Token 的密钥和算法相同。换句话说,业务服务器同样可以创建有效的 Token。
八、Token的创建
webapi接口token定义:
public string GetToken(){
string token=md5('control'+'action'+'自定义密钥');
return token;
}
九、Token的 获取
方式一:从cookies获取
/**
* 从Cookies中获取token
* */
function getToken(){
var strcookie = document.cookie;//获取cookie字符串
var arrcookie = strcookie.split("; ");//分割
//遍历匹配
for ( var i = 0; i < arrcookie.length; i++) {
var arr = arrcookie[i].split("=");
if (arr[0] == "token"){
return arr[1];
}
}
return "";
}
方式二:从Url获取
/**
* 从Url中获取token
*/
function getTokenByUrl(){
var token = GetQueryString("token");
return token;
}
//获取url参数
function GetQueryString(name){
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r!=null)return unescape(r[2]); return null;
}
注意:https://blog.csdn.net/qq_34825875/article/details/79569579 (在vue中如何获取token,并将token写进header)
十、Token的使用
方式一:将token放入请求头
$.ajax({
type: "POST",
headers: {
Accept: "application/json; charset=utf-8",
userToken: "" + userToken
},
url: "localhost/api/Home/GetString",
data: mydata,
contentType: "application/json",
dataType: "json",
success:function(data){
// 请求成功
}
});
方式二:在请求之前设置request请求头
$.ajax({
type: "POST",
url: "/index",
data: mydata,
contentType: "application/json",
dataType: "json",
beforeSend: function(request) {
request.setRequestHeader("Authorization", token);
},
success: function(data) {
alert(data.msg);
}
});