背景:
1.需要在.net5 WebAPI中添加访问授权机制,即实现在登录时颁发用户凭证,后续需要通过凭证访问其他接口,如果凭证不合法,不能正常访问接口;
2.网站嵌入到winform客户端中,利用winform可以获取客户端的mac地址的权限,将mac地址作为权限中的一部分,即将mac地址和账号绑定来实现账号只能在指定客户端电脑上使用;
3.为了防止在登录后获取token后在其他客户端上使用,利用IP绑定token;
实现:
首先在登录成功后,将客户端的IP作为加密key,username(登录账号)+guid+cpu序列号为加密内容进行加密,加密结果作为token凭证颁发给用户;
后续Api访问授权过滤流程:
1. 正式环境,先对请求来源进行限制,如http请求header中的referer,检查是不是在系统设置的白名单中;如不在,拒绝访问;
2. 其次,在header中取token,如果取不到,拒绝访问;
3. 获取客户端IP,将IP进行处理作为长度32的字符串(现在是除去非数字,右侧用0填充);
4. 将32位字符串作为key对称解密token,解密失败则拒绝访问;
5. 解密出来的字符串,内容格式为:username + "|" + guid+"|"+cpuid;guid作为Redis的key去取值,取不到,拒绝访问;
6. 从Redis中取出来的Value,内容格式为:username+"|"+keeplogin+"|"+cpuid;cpuid为该账号登录时所在客户端的cpu序列号
7. 用"_hw_" + username作为key去Redis中取Value,如果为空拒绝访问;
8. 7中取到的Value为限制账号绑定的cpu序列号,为”all”时代表不限制,可以随意客户端访问;不为“all”时,判断7中Value是否包含6中cpuid,如不包含,则拒绝访问;
访问流程图:
注意:加密方式和加密内容可以根据具体的业务限制去做,这里只是列举了一种寄宿在winform中的网站API访问授权流程;