最近发现公司接口的验密方式很简单,就是简单的用户名密码校验。客户方面的负责人说要修改一下,所以想起了微信的验证密码的方式故写了这个Demo以供大家学习参考;

接口:WebService

方式:Token动态加密签名;

名词解释:Token就是服务端和客户端约定好的一个固定的密码字符串。微信接口上这么写的我就直接般过来了,结果有朋友不理解。

WebService头参数说明:

Signature:加密签名,字符串类型;

Timestamp:当前时间戳,DateTime类型(注意客户端时间和服务端时间差不能大于7秒,可以修改)

Nonce:随机数,字符串类型;

参数处理:

  1. 客户端用Token+ Timestamp+ Nonce后的字符串进行字典排序;
  2. 客户端将排序后的字符串进行MD5加密;
  3. 将加密后的字符串作为Signature参数传到服务端;

服务端接受到参数后也是按照,自己的Token+客户传的Timestamp+客户传的 Nonce 然后同样按照字典排序,MD5加密后和客户端的Signature参数做对比,如果一致则验证成功!(服务器要验证客户端传入的时间戳参数和系统当前时间差值不能大于7秒,以保证口令过期后不能用)。

服务端代码:

/// <summary>

/// WebService接口 SoapHeader类

/// </summary>

public class APISoapHeader : System.Web.Services.Protocols.SoapHeader

{

/// <summary>

///  加密签名

/// </summary>

public string signature { get; set; }

/// <summary>

/// 时间戳

/// </summary>

public DateTime timestamp{ get; set; }

/// <summary>

/// 随机数

/// </summary>

public string nonce { get; set; }

}

/// <summary>

/// WebService1 的摘要说明

/// </summary>

[WebService(Namespace = "http://tempuri.org/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

[System.ComponentModel.ToolboxItem(false)]

// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。

// [System.Web.Script.Services.ScriptService]

public class WebService1 : System.Web.Services.WebService

{

public APISoapHeader header { get; set; }

[System.Web.Services.Protocols.SoapHeader("header")]

[WebMethod]

public string HelloWorld(string msg)

{

if (header != null && TokenHelper.TokenVerify(header.signature, header.timestamp, header.nonce))

{

return "Hello World:" + msg;

}

else

{

return "NO";

}

}

}

验证代码:

public abstract class TokenHelper

{

/// <summary>

/// 验证加密签名

/// </summary>

/// <param name="header"></param>

/// <returns></returns>

public static bool TokenVerify(string signature,DateTime timestamp, string nonce)

{

bool isok = false;

if (!string.IsNullOrEmpty(signature)

&& !string.IsNullOrEmpty(nonce))

{

TimeSpan ts = DateTime.Now.Subtract(timestamp).Duration();

if (ts.Seconds < 7)//如果请求端时间戳与系统时间差小于7秒则继续验证

{

if (signature.Equals(TokenHelper.GetSignature(timestamp, nonce)))

{

return true;

}

}

}

return isok;

}

/// <summary>

/// 获取加密签名

/// </summary>

/// <param name="timestamp"></param>

/// <param name="nonce"></param>

/// <returns></returns>

public static string GetSignature(DateTime timestamp, string nonce)

{

string token = System.Configuration.ConfigurationManager.AppSettings["APIToken"];

string str = string.Format("{0}{1}{2}", token, timestamp.ToString(), nonce);

List<char> str2 = str.ToList<char>();

str2.Sort();

string str3 = "";

foreach (var item in str2)

{

str3 = string.Format("{0}{1}", str3, item.ToString());

}

return TokenHelper.MD5Encrypt(str3);

}

/// <summary>

/// MD5加密

/// </summary>

/// <param name="strText"></param>

/// <returns></returns>

public static string MD5Encrypt(string strText)

{

string cryptStr = "";

MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

byte[] bytes = Encoding.UTF8.GetBytes(strText);

byte[] cryptBytes = md5.ComputeHash(bytes);

for (int i = 0; i < cryptBytes.Length; i++)

{

cryptStr += cryptBytes[i].ToString("X2");

}

return cryptStr;

}

}

测试代码:

class Program

{

static void Main(string[] args)

{

string msg = Console.ReadLine();

ServiceReference1.WebService1SoapClient client = new ServiceReference1.WebService1SoapClient();

ServiceReference1.APISoapHeader header = new ServiceReference1.APISoapHeader();

Random random = new Random();

header.timestamp = DateTime.Now;

header.nonce = random.Next(0, 100).ToString();

header.signature = TokenHelper.GetSignature(header.timestamp, header.nonce);

//Thread.Sleep(7000);//如果大于7秒则失败;

msg = client.HelloWorld(header, msg);

Console.WriteLine(msg);

Console.ReadKey();

}

}

该方法的好处就是传输的密码是随时变化的,而且就算是第三方截获了密码,去根据两个动态值解密也相当困难,而且截获的密码也只能用7秒,7秒后则自动失效;

ASP.NET MVC 在WebService中Token的使用方法的更多相关文章

  1. 在ASP.NET MVC应用程序中实现Server.Transfer()类似的功能

    在ASP.NET MVC应用程序中,如果使用Server.Transfer()方法希望将请求转发到其它路径或者Http处理程序进行处理,都会引发“为xxx执行子请求时出错”的HttpException ...

  2. ASP.NET MVC 3: Razor中的@:和语法

    原文 ASP.NET MVC 3: Razor中的@:和语法 [原文发表地址] ASP.NET MVC 3: Razor’s @: and <text> syntax[原文发表时间] De ...

  3. ASP.NET MVC开发学习过程中遇到的细节问题以及注意事项

    1.datagrid中JS函数传值问题: columns: { field: 'TypeName', title: '分类名称', width: 120, sortable: true, format ...

  4. 7.ASP.NET MVC 5.0中的Routing【路由】

    大家好,这一篇向大家介绍ASP.NET MVC路由机制.[PS:上一篇-->6. ASP.NET MVC 5.0中的HTML Helpers[HTML帮助类] ] 路由是一个模式匹配系统,它确保 ...

  5. mvc的视图中显示DataTable的方法

    mvc的视图中显示DataTable的方法: 不断的循环画出table @{ ViewBag.Title = "ShowDataTable"; } @using System.Da ...

  6. asp.net mvc 微信公众号token验证

    本人的公众号要申请成为开发者,必须经过token认证.微信公众号的官方代码只列出了PHP代码的实例,明显是歧视.net用户.我用的asp.net mvc中的web api,结果调了好久都没有成功,最后 ...

  7. ASP.NET MVC AJAX 请求中加入 antiforgerytoken 解决“所需的防伪表单字段“__RequestVerificationToken”不存在”问题

    在ASP.NET mvc中如果在表中使用了@Html.AntiForgeryToken(),ajax post不会请求成功 解决方法是在ajax中加入__RequestVerificationToke ...

  8. 如何在ASP.NET MVC和EF中使用AngularJS

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) AngularJS作为一个越来越流行的前端框架,在使用ASP.NET MVC和实体框架开发W ...

  9. ASP.NET MVC 4.0中选择Windows 验证默认出错拒绝访问的原因和解决方案

    在VS 2012或者2013 中,根据模板创建一个ASP.NET MVC 4.0的应用程序,选择下面的模板 然后选择Intranet Application 不对源代码做任何修改,直接按下F5调试,会 ...

随机推荐

  1. 高级四则运算器—结对项目反思(193 & 105)

    高级四则运算器—结对项目反思(193 & 105) 本周我和一位韩国同学(71061105)一起结对编程完成了我们的结对项目——高级的小学四则运算题目生成器. PSP表格   PSP2.1 P ...

  2. 统一者管理员指南(Unifier Administration Guide)中文

    统一者管理员指南 Unifier Administration Guide 2014年6月 发布 2014年11月翻译 10.0版本 10.0.1译 关于译者 翻译者QQ:77811970 Email ...

  3. JavaScrip的DOM操作

    1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型,文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西 2.Windows对象操作 一.属性和方法 二.Window.open(& ...

  4. 关于c++数的进制的经验

    默认状态下,数据按十进制输入输出.如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制. 注意: 1.使用不带.h的头文件& ...

  5. 将C1Chart数据导出到Excel

    大多数情况下,当我们说将图表导出到Excel时,意思是将Chart当成图片导出到Excel中.如果是这样,你可以参考帮助文档中保存和导出C1Chart章节. 不过,也有另一种情况,当你想把图表中的数据 ...

  6. Ubuntu配置任意版本的apt-get镜像

    我们知道,迄今为止,Ubuntu已有多个发行版,如11.04.11.10,以至于现在最新的16.*.而我们平常通过apt-get来安装软件,如果OS版本不同,那么镜像源的配置就不同,否则就会出现找不到 ...

  7. pbfunc外部函数扩展应用-在Powerbuilder中进行Http的GET、POST操作

    利用PBFunc扩展函数进行Http的操作时,需要对n_pbfunc_http的以下几个函数进行参数设置: of_set_URL(...)//要进行GET或POST的url,必须 of_set_Con ...

  8. 【Asphyre引擎】Asphyre时隔3年,更名为PXL,全平台支持!

    ps:回忆日志 新版本10月初就推出了,我第一时间(10.2日更新,我当天就看到了)下载下来.发现部分Demo需要XE8才能编译通过,又去下载了一个XE8.折腾完已经深夜,只是粗粗的把Demo都编译了 ...

  9. Orchard中文版源码下载

    本版本基于Orchard1.7.2修改: 新增Bootstrap主题 新增中文语言包 增加了对Sqlite.Orchard数据库的支持 优化工程,减少临时符号生成,增加工程效率 和一些BUG的修正 默 ...

  10. D/A转换器

    电荷:带正负电的基本粒子.电的本质是使正负电荷分开,使电荷发生移动,实质是电子的转移,并不是创造电荷.电压:单位正电荷受电场力作用从A点移动到B点所做的功.电压方向从高电位指向低点位.电压是推动电荷定 ...