文章目录
前言
之前已经介绍了restful风格wcf,本篇将介绍一下,调用restful的权限认证的内容。在调用的接口,为了安全,总会需要对请求进行权限认证的,以防一些非法的操作。
提示:以下是本篇文章正文内容,下面案例可供参考
一、JWT是什么?
Json web token (JWT)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,是目前最流行的跨域身份验证解决方案。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
JWT的构成
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
其他就不详细介绍了,网上很详细,整个流程就是这样的:
二、如何使用JWT身份验证
1.前端-用户登录成功后,服务端通过jwt生成一个随机token给用户
代码如下(示例):
var str = { "UserName": "test", "Pwd": "123456"}
jQuery.support.cors = true;
$("#login").click(function () {
$.ajax({
url: "http://localhost:5393/RestCustomerService.svc/Login",
data: JSON.stringify(str),
method: "POST",
success: function (data) {
if (data.Success) {
//为简单起见,将token保存在全局变量中。
window.token = data.Token;
alert("登录成功");
} else {
alert("登录失败:" + data.Message);
}
}
});
});
JWT toke:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiLnrb7lj5HogIXkv6Hmga8iLCJpYXQiOjE2MzIxODQ5NzguMCwiZXhwIjoxNjMyMTkyMTc4LjAsImF1ZCI6Imh0dHA6Ly9leGFtcGxlLmNvbSIsInN1YiI6IkhvbWVDYXJlLlZJUCIsImp0aSI6IjIwMjEwOTIxMDg0MjUyIiwiVXNlck5hbWUiOiJMT05HLlpIQU5HIiwiVXNlclB3ZCI6ImphY2sxMjM0NTYiLCJVc2VyUm9sZSI6IkhvbWVDYXJlLkFkbWluaXN0cmF0b3IifQ.2TbYJdO8apLRm7PIfsYGapvjiwj1tI1kyAwHDY_nhuA
2.前端-用户访问时需携带token,发给服务端
代码如下(示例):
function HttpPostEx() {
var str = { "ApplicationId": 12, "ApplicationName": "JSCC_NMCA", "FromUsers": "TEST", "ToUsers": "ToUsers01", "CcUsers": "CcUsers01", "Subject": "Subject01", "Contents": "Contents01", "Folio": "Folio01", "LinkAddress": "LinkAddress01" };
jQuery.support.cors = true;
$.ajax({
type: "POST",
url: "http://localhost:5393/RestEmailService.svc/AddEmail",
data: JSON.stringify(str),
cache: false,
dataType: "json",
contentType: "application/json",
beforeSend: function (xhr) {
//将token发给服务端验证。
xhr.setRequestHeader("Authorization", window.token);
},
success: function (data) {
alert("star03");
alert(data.ResultEx.length);
alert(JSON.stringify(data.ResultEx));
},
complete: function (xhr) {
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("error(HttpPostEx):" + errorThrown);
}
});
}
3.后端-用户访问时需携带token,发给服务端
4.服务端接收到token之后,通过jwt对token进行校验是否超时、是否合法
二、校验接口
首先我们添加一个校验身份的一个方法
然后,在每个接口中,加上权限认证的语句,是不是太烦了,可以通过在WebServiceHostFactory中的拦截请求上下文中Authorization做到
然后,在注册路由的时候,做一下修改:
总结
之前跨域调用前端使用jsonp,可是jsonp没法在http header 里传送Authorization信息,通过地址传又觉得麻烦,前端使用jQuery.support.cors = true解决这问题。
还可以使用Redis缓存用户的身份信息来减轻服务器的反复验证压力,记录点点滴滴