当前位置: 移动技术网 > IT编程>开发语言>.net > 实现一个简单的基于Token的身份认证

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

2019年04月18日  | 移动技术网IT编程  | 我要评论

诺奖经济学奖揭晓,疯魔网,品质管理网

  这个例子是基于客户端与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; }

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网