最近发现公司接口的验密方式很简单,就是简单的用户名密码校验。客户方面的负责人说要修改一下,所以想起了微信的验证密码的方式故写了这个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. 反射动态创建不同的Processor

    1. 定义抽象方法 public abstract class BaseProcesser    {        public abstract void GetCustomerReportCard ...

  2. [JS] JavaScript由浅入深(1) 基本特性

    1.全局变量的特性: 在函数体内直接写的变量(未用var标志)自动升级为全局变量. (function func() { i = 100; }()); alert(i); 非常不建议不写var. va ...

  3. Spring应用——事务管理

    事务基础:请参看:http://www.cnblogs.com/solverpeng/p/5720306.html 一.Spring 事务管理 1.前提:事务管理器 在使用 Spring 声明式事务管 ...

  4. “康园圈--互联网+校园平台“项目之Sprint3

    sprint3任务列表 1.部署项目内测版上线,并绑定相应域名. 2.添加测试用的模拟数据. 3.写已实现功能及效果汇报文档. 4.写项目总结博客. 5.记录并分析用户反馈. 看板动态 第一次 第二次 ...

  5. poi中getPhysicalNumberOfRows()和getLastRowNum()区别

    getPhysicalNumberOfRows()获取的是物理行数,也就是不包括那些空行(隔行)的情况. getLastRowNum()获取的是最后一行的编号(编号从0开始). 通过getPhysic ...

  6. 解决PL/SQL查询结果乱码的问题

    首选查询oracle服务端的编码,然后将客户端NLS_LANG设置成和Oralce服务端一样的编码即可. 1.检查服务器编码: 执行SQL语法: select * from v$nls_paramet ...

  7. WCF开发框架之插件化应用模式升级

    自从在<Winform开发框架之插件化应用框架实现>一文中,介绍并总结了Winform开发框架插件化应用框架的实现后,赢得了很多同行和客户的支持,于是把我的WCF开发框架.混合式开发框架都 ...

  8. VisualStudio代码调试输出跟踪

    class EFIntercepterLogging : DbCommandInterceptor { private readonly Stopwatch _stopwatch = new Stop ...

  9. 交通银行 Java Socket 服务启动 管理 WINDOWS 版

    按照交通银行提供的无界面启动方法试验了很多次,都没有成功,所以自己动手用C# 知识写了一个. 小工具可以判断 交通银行 JAVA SOCKET 服务是否启动,并可以启动/关闭服务 主要代码如下: 判断 ...

  10. html5人物图片360度立体旋转

    体验效果:http://hovertree.com/texiao/html5/10.htm 下载:http://hovertree.com/hvtart/bjae/t16oddyt.htm 代码如下: ...