1一台装有SQL Server的客户机Client(此处为物理机,OS:Windows7)
2一台装有SQL Server的服务器Server(此处为虚拟机,OS:Windows Server 2003)
3Client和Server处于同一个网段中(虚拟机网络设置选择桥接,并将虚拟机的IP与物理机的IP设置为同一个网段,这里为102011)
实施步骤:
1Client的登录用户为wh,密码为qwe123!@#
2在Server中创建一个用户名为wh,且密码为qwe123!@#
3在Server中的SQL Server中创建一个登录名,登录方式为Windows身份,登录名选择刚刚创建的用户名wh
4将Server中的SQL Server设置为允许远程连接
以下为环境准备:
服务器Server:IP:102011237
客户机Client:IP:102011208
Client和Server之间ping,测试能否ping通:
以上环境准备好以后,下面开始进行 *** 作:
1在Server中创建一个用户wh
2设置密码为qwe123!@#
3在Server中创建一个SQL Server的登录名身份验证选择Windows
4在选择用户中选择刚刚新建的用户wh
5点击确定完成登录名的创建
6可以看到在Server的SQL Server中登录名中多了一个WANGHUI\wh用户,并且验证方式为Windows
7到Client中以Windows身份连接Server中的SQL Server
8成功连接到Server 102011237
域环境下的Windows身份验证访问远程SQL Server实施步骤和工作组下差不多,在此不再赘述。之前写过关于token的文章 Token - 服务端身份验证的流行方案 ,是基于当时的实现方案来写的。后来进行了设计的review,被提出有下面的问题:
针对上面的问题,我拉来公司的两位同事进行讨论,将得出的方案作为token20版本。
如何做到防止伪造,就是说即使算法泄露,服务端也能识别出来。要做到这一点,服务端就要缓存token的存根,当请求到达时,比较请求中的token和服务端同一个用户的token存根是否匹配。如果匹配,验证通过;如果不匹配,表示token是伪造的;或者账号已经在另外的设备上登录,从而挤掉了当前的token,让用户重新登录。所以这个方案,顺便解决了第3个问题。
服务端缓存token,可以使用redis,以userId为key,以详细用户数据和token为value。收到请求时,需要从token中解析出userId,这样才能进一步根据userId从缓存中查数据。但是有一个问题是如何判断token的有效期。
在前一篇文章中,从token解析出token的创建时间,然后加上有效期,跟系统的当前时间进行比较。如果大于当前时间,表示有效,否则表示过期。但是既然服务端已经把token放入缓存了,可以直接使用缓存的有效期来表示token的有效期。一句话:如果根据token解析出来的userId从缓存中查不出来什么,表示token已经过期。
参考了微信登录,他们是基于OAuth20标准来做的。当时也对OAuth20进行了调研,结果是它是用来为第三方请求资源时提供的一种授权和身份验证机制。简单来说,它的时序图是下面的样子:
因为我们需要维护自己的用户体系,而且只有一个系统,没有必要搞这么多事,所以最后决定放弃OAuth20,自己实现身份验证机制,这其实也是参考了之前的一个项目的做法。
微信登录中提到了两个token:access_token和refresh_token。access_token用来请求业务的时候进行身份验证。当access_token过期时,可以使用refresh_token来刷新token(即请求新的token),直到refresh_token也过期了,那么第三方应用需要重新请求授权。access_token有较短的有效期,一般2个小时,refresh_token有效期较长,有30天。
映射到我们的需求里,就是APP登录的时候,生成access_token和refresh_token,一同返回给APP。当access_token失效时,APP使用refresh_token来请求刷新token。如果refresh_token过期,需要用户重新登录。这里提到的refresh_token,和上文中所说的摘要是同一个作用。
这个方案用来解决第2个问题,但是针对refresh_token的有效期的实现,我是有点纠结的。如果像access_token一样,使用服务器缓存来控制refresh_token的有效期,redis需要缓存一个月的时间,注意是每一个用户。
所以我选择了另外的方案,即对于refresh_token,我们采用之前的方案。根据解析出来的创建时间,加上配置的有效期,跟当前时间做对比。从而判断是否已经过期。
这样又会有前面提到的问题,如果refresh_token的算法泄漏,那么别人可以自己生成refresh_token来做任何事。面对这个问题,实现机制在刷新token时会验证token的缓存是否依然存在,如果存在就拒绝刷新token。但是在用户2个小时没有请求的情况下,其access_token已经从缓存中移除,这个时机就不能防止伪造的refresh_token了。所以我们只是缓解了这个问题,并没有真正解决它。
针对这个问题,我们有另外的一些想法:
这段话说服我了,当前的工作还有很多,这一块不是最紧急的,暂时就这样吧。我总结下关于refresh_token的两种做法,供读者们根据自己的情况选择:
用户在注册、登录之后,服务器根据userId、devicecode [1] 来生成accessToken和refreshToken,其中accessToken放入缓存中,以userId为key。服务端返回accessToken和refreshToken给app。
[1] devicecode是设备指纹,由app端提供。作为生成token的干扰码的一部分,另外一部分是服务端的配置项。
在拦截器中拦截,从请求数据中读取accessToken和devicecode,解密出userId。对于之后的几种状态,做一下解释:
通过验证的进行业务处理,否则返回拒绝及拒绝的原因给app。
还有一点值得一提,服务端提供的接口中,有需要登录的,有不需要登录的,还有一种是可选的,即如果登录了能返回更详细的信息;否则只返回基本的信息。比如说排行榜,如果用户没有登录,那就是返回简单的排行榜;如果用户已经登录了,服务端还会告诉你排行榜中哪一个是你。
所以token的身份验证,拆分到了两个拦截器,一个拦截所有请求,负责解析token;一个拦截需要登录的接口,拒绝未登录用户的请求:
accessToken解析拦截器的设计思想:
登录拦截器的设计思想:
服务端从请求中读取refreshToken和devicecode,解密出userId。
解密失败,直接返回失败信息。
解密成功,但是根据userId可以从缓存中读到accessToken,表示accessToken还未过期,不应该请求刷新token,所以也会直接拒绝。
解密成功,但是refreshToken已经过期,拒绝。
ok的话就生产token,其中accessToken是一定重新生成的,但是如果refreshToken不是即将过期的情况下,是直接返回同一个refreshToken,而不是重新生成。这是为了避免服务端产生过多的有效的refreshToken,如果refreshToken相当于对app端的授权,服务端不应该无限制的发放授权,只有在前一个授权快要过期了,才发一个新的。1)身份认证系统的构成
动态认证系统主要由令牌、身份认证软件、API接口三部分组成
2)动态身份认证技术特点
动态身份认证技术特点表现为:适应各种网络环境;对信息资源提供深度保护;遵循相关标准协议,具备高度通用性;利用函数对接实现与客户软件无缝连接;提供令牌和认证服务器的物理安全保护,防止强行窃取相关信息;采用专用认证服务软件进行集中认证,既提高效率、又简化系统管理。
3)认证系统与客户系统集成
动态身份认证服务器提供了与客户服务器的软件接口,即认证服务接口函数。通过对它的调用得到认证服务器提供的认证服务。函数接受调用请求后,能自动决定把请求发往认证服务器或后备服务器,随后把认证结果返回给客户服务器。当客户服务器上的应用程序收到网络客户的存取要求时,调用令牌, 认证客户端函数,后者负责向认证服务器发送认证请求并反馈认证结果。应用程序根据反馈的认证结果决定用户访问授权或请求拒绝。1>使用管理员帐户登录
Web
服务器。
2>单击“开始”,再单击“控制面板”。
3>在“控制面板”中双击“管理工具”。
4>双击“Internet
信息服务”。
5>单击
Web
服务器节点。
服务器名称下方将打开一个“网站”文件夹。
6>您可以为所有网站或个别网站配置身份验证。若要为所有网站配置身份验证,
请右击“网站”文件夹,然后单击“属性”。若要为单个网站配置身份验证,
请打开“网站”文件夹,右击单个网站,然后单击“属性”。
屏幕上会显示“属性”对话框。
7>单击“目录安全性”选项卡。
8>在“匿名访问和身份验证控制”节中,单击“编辑”。
将显示“身份验证方法”对话框。
9>在“用户访问需经过身份验证”下,选择“集成
Windows
身份验证”。
10>单击“确定”关闭“身份验证方法”对话框。
11>单击“确定”关闭“属性”对话框。
12>关闭“Internet
信息服务”窗口。
Android 有如下身份验证方式:
1进入设置里面,选择安全选项,打开启动密码,可以看到正常的一些身份验证方式:
一般是可以设置一个六位数的密码。
2设置手势密码。每次启动手机需要绘制保留的图案才能解锁。
3使用指纹识别的方式登录。将上次录入的手指按住指纹识别器上,就可以验证登录。
4微信等软件,还开发了匹配声波的方式进行身份验证。说保留在微信同样的一段话,匹配即可登录。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)