WCF RestFul+JWT身份验证

30 篇文章 0 订阅
27 篇文章 0 订阅


前言

之前已经介绍了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缓存用户的身份信息来减轻服务器的反复验证压力,记录点点滴滴

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

panda_225400

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值