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

    private static DateTime BaseTime = new DateTime(1970, 1, 1); 将unixtime转换为.NET的DateTime public static ...

  2. SQL Server 2005 Service Broker

    一.引言 SQL Server 2005 的一个主要成就是可以实现可靠.可扩展且功能完善的数据库应用程序.与 .NET Framework 2.0 公共语言运行库 (CLR) 的集成使开发人员可以将重 ...

  3. Redis设计与实现-持久化篇

    redis数据库 默认16个数据库,每个数据库由一个redis.h/redisDb结构表示,此结构里的dict字典与expires字典,其中dict保存了该库所有键值对,此字典即为键空间:expire ...

  4. 【助教】Java获取数据库数据展示

    本文将给出一个最简单的Java查询数据库中一张表的数据并将查询结果展示在页面的例子. 实际上,我们要解决以下两个问题: Java与数据库交互(以JDBC为例) 数据展示在前台页面(以Servlet+J ...

  5. 重构第16天 封装条件(Encapsulate Conditional)

    理解:本文中的“封装条件”是指条件关系比较复杂时,代码的可读性会比较差,所以这时我们应当根据条件表达式是否需要参数将条件表达式提取成可读性更好的属性或者方法,如果条件表达式不需要参数则可以提取成属性, ...

  6. 重构13天 抽取方法对象(Extract Method Object)

    理解:本文中的“提取方法对象”是指当你发现一个方法中存在过多的局部变量时,你可以通过使用“提取方法对象”重构来引入一些方法,每个方法完成任务的一个步骤,这样可以使得程序变得更具有可读性. 详解:如下代 ...

  7. ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践

    解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现. 此处手札 供后人参 ...

  8. jQuery实现星星评分功能

    一.这是我做的调查问卷中的一个功能.(第三方MVC框架) 二.功能说明:1.用户点击星星,将值放到隐藏域中.2.用户可以重新点击星星修改回答. 前台JS代码: <script type=&quo ...

  9. Python基础:序列

    一.概述 序列类型(Sequence Types)类似于C中的数组,它是包含一组成员的连续列表,这些成员紧邻排列,并且可以通过序号(下标偏移量)访问其中的一个或多个成员.序列类型的示意图如下所示: P ...

  10. 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性

    [源码下载] 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性 作者:webabcd 介 ...