这个例子是基于客户端与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, , 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[] { "",""};
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, , inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
}
Str = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
Ret[] = "";
Ret[] =Str;
}
}
catch (Exception ex)
{
Ret[] = "-1";
Ret[] = ex.ToString();
}
finally {
}
return Ret;
}

最新文章

  1. Linux常用命令:sed
  2. MathType 公式后的空格问题
  3. 从新注册 .DLL CMD 运行regsvr32 *.dll注册该DLL 或 regsvr32 /s *.DLL 求证
  4. 企业信息系统——CRM
  5. clock_gettime的使用,计时比clock()精确
  6. ActiveMQ, Qpid, HornetQ and RabbitMQ in Comparison
  7. NPOI 辅助类
  8. 股票作手回忆录Digest(转)
  9. Top 10 JavaScript编辑器,你在用哪个?
  10. JSP入门 el表达式
  11. NC和NO、耳机美标和欧标的区别
  12. TF Multi-GPU single input queue
  13. 七种经典排序算法及Java实现
  14. TestNg 7.依赖测试
  15. BZOJ1041 HAOI2008圆上的整点(数论)
  16. 大数据自学6-Hue集成环境操作Hbase
  17. 普通01背包问题(dp)
  18. CentOS 建立本地yum源服务器
  19. 20145127《java程序设计》第三次实验
  20. 程序媛计划——python爬虫

热门文章

  1. message.go
  2. timeCache.go
  3. go语言nsq源码解读八 http.go、http_server.go
  4. BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
  5. JavaSE-管道流
  6. EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下?
  7. 带logo图片或不带logo图片的二维码生成与解析,亲测成功
  8. java泛型中使用的排序算法——归并排序及分析
  9. SVM分类器实现实例
  10. python爬虫Scrapy(一)-我爬了boss数据