实现一个简单的基于Token的身份认证
程序员文章站
2022-06-18 10:02:05
这个例子是基于客户端与webapi进行进行交互的身份认证,当然也适用于其他情况下的身份认证。 简单的交互过程: 1.首先输入用户名、密码进行登录操作 2.服务器验证用户名、密码的正确性,验证通过之后,服务器对一个json字符串进行加密,加密的内容、加密方法可以自己确定。 本次我加密的内容主要是用户名 ......
这个例子是基于客户端与webapi进行进行交互的身份认证,当然也适用于其他情况下的身份认证。
简单的交互过程:
1.首先输入用户名、密码进行登录操作
2.服务器验证用户名、密码的正确性,验证通过之后,服务器对一个json字符串进行加密,加密的内容、加密方法可以自己确定。
本次我加密的内容主要是用户名和登录时间,可根据需求添加其他加密内容,加密方法就是采用des加密。然后将加密的后的字符串(token)返回给到客户端,客户端需要自己保存起来。
3.接下来,客户端的每次请求都需要带上这个token。
4.对于客户端的每次请求,服务器首先都要去获取token,检查token是否合法,并解密token内容,检查token是否过期等。
token格式
未加密之前的字符串是什么样的呢,我这里是最简单的格式,如下:
{ "username":"",//用户名 "createtime":""//认证时间 }
登录认证通过之后,把这个json格式的字符串进行加密生成字符串token,返回给客户端。
至于好处呢,服务器不需要保存会话状态,不用担心会话丢失,也可以减轻服务器压力,然后利用这种方式也方便部署分布式服务,将一个服务拆分成多个小服务,减轻单台服务器的压力。
des加解密算法
这里只是一种加解密算法而已,根据需要自己选择合适的算法。
const string deskey = "sddsdds";//秘钥 const string desiv = "errtertet";//向量 //加密 public string encryptdes(string toencrypt, string deskey, string desiv) { using (descryptoserviceprovider des = new descryptoserviceprovider()) { //创建des实例 byte[] inputbytearray = encoding.utf8.getbytes(toencrypt);//将需要加密的内容转为字节 des.key = asciiencoding.ascii.getbytes(deskey);//秘钥 des.iv = asciiencoding.ascii.getbytes(desiv);//向量 system.io.memorystream ms = new system.io.memorystream();//创建流实例 using (cryptostream cs = new cryptostream(ms, des.createencryptor(), cryptostreammode.write)) {//把输出的内容通过第二个参数转换(加密)馈送到第一个参数ms cs.write(inputbytearray, 0, inputbytearray.length); cs.flushfinalblock(); cs.close(); } //转为base64后输出 string str = convert.tobase64string(ms.toarray()); ms.close(); return str;
} }
//解密
public string[] decodedes(string paras, string deskey, string desiv) { string str = ""; string[] ret = new string[2] { "",""}; try { byte[] inputbytearray = convert.frombase64string(paras); using (descryptoserviceprovider des = new descryptoserviceprovider()) { des.key = asciiencoding.ascii.getbytes(deskey); des.iv = asciiencoding.ascii.getbytes(desiv); system.io.memorystream ms = new system.io.memorystream(); using (cryptostream cs = new cryptostream(ms, des.createdecryptor(), cryptostreammode.write)) { cs.write(inputbytearray, 0, inputbytearray.length); cs.flushfinalblock(); cs.close(); } str = encoding.utf8.getstring(ms.toarray()); ms.close(); ret[0] = "1"; ret[1] =str; } } catch (exception ex) { ret[0] = "-1"; ret[1] = ex.tostring(); } finally { } return ret; }