欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

实现一个简单的基于Token的身份认证

程序员文章站 2022-06-18 10:02:05
这个例子是基于客户端与webapi进行进行交互的身份认证,当然也适用于其他情况下的身份认证。 简单的交互过程: 1.首先输入用户名、密码进行登录操作 2.服务器验证用户名、密码的正确性,验证通过之后,服务器对一个json字符串进行加密,加密的内容、加密方法可以自己确定。 本次我加密的内容主要是用户名 ......

  这个例子是基于客户端与webapi进行进行交互的身份认证,当然也适用于其他情况下的身份认证。

  简单的交互过程:

 实现一个简单的基于Token的身份认证

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; }