最近发现公司接口的验密方式很简单,就是简单的用户名密码校验。客户方面的负责人说要修改一下,所以想起了微信的验证密码的方式故写了这个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. [Solution] ASP.NET Identity(2) 空的项目使用

    在本节中,我将说明将ASP.NET Identity添加到现有的项目或者一个空项目.我将介绍你需要添加的Nuget和Class.此示例中,会使用LocalDB. 本节目录: 注册用户 登入登出 注册用 ...

  2. WPF中实现自定义虚拟容器(实现VirtualizingPanel)

    WPF中实现自定义虚拟容器(实现VirtualizingPanel) 在WPF应用程序开发过程中,大数据量的数据展现通常都要考虑性能问题.有下面一种常见的情况:原始数据源数据量很大,但是某一时刻数据容 ...

  3. JPA学习(2)注解

    上一篇学习了JPA的helloworld,也初略的使用了一些注解,接下来就细细的了解一下有哪些注解,和这些注解的作用 JPA的基本注解: ①@Entity,@Table,@Id,@GeneratedV ...

  4. ComboBox的联动(三层架构)

    需求:根据年级下拉框的变化使得科目下拉框绑定次年级下对应有的值 我们用三层架构的模式来实现 1.我们想和数据库交互,我们首先得来先解决DAL数据库交互层 01.获得年级下拉框的数据 在GradeDAL ...

  5. Linux下建立Nexus私服

    Linux下建立Nexus私服 要安装3个东西,然后配置私服: 1.JDK 2.Maven 3.Nexus 然后配置 1.JDK的安装 下载JDK安装包,格式为RPM格式,安装即可 安装程序 #rpm ...

  6. 硅谷新闻8--TabLayout替换ViewPagerIndicator

    1.关联库 compile 'com.android.support:design:23.3.0' 2.布局写上TabLayout <android.support.design.widget. ...

  7. nodeJS中npm常见的命令

    常用的nodeJS中npm的命令:npm主要是node包管理和发布的工具.npm常用的命令:1:npm install <name> //(下载包) 下载后的包放在当前路径下面 npm i ...

  8. 通过原生js添加div和css

    function createStyle(){ return"*{padding:0;margin:0;border:0}.loading{width:640px;height:1024px ...

  9. DOM性能小记

    在使用DOM操作时,同样的效果用不同的方式来实现,性能方面也会有很大的差异.尤其在移动式设备上,资源本来就很有限,一旦DOM写不好的话操作就会非常卡顿.这个周末,就写个DOM性能小记吧.错漏之处,望多 ...

  10. Office版本差别引发的语法问题

    由于没有源代码,今天反编译了一个基于.NET的dll类库,再次遇到office版本差异问题,所以把它记录下来. 在反编译时,需要Aspose.Cells 5.3.1(Aspose是一套.NET类库,其 ...