ASP.NET MVC 在WebService中Token的使用方法
最近发现公司接口的验密方式很简单,就是简单的用户名密码校验。客户方面的负责人说要修改一下,所以想起了微信的验证密码的方式故写了这个Demo以供大家学习参考;
接口:WebService
方式:Token动态加密签名;
名词解释:Token就是服务端和客户端约定好的一个固定的密码字符串。微信接口上这么写的我就直接般过来了,结果有朋友不理解。
WebService头参数说明:
Signature:加密签名,字符串类型;
Timestamp:当前时间戳,DateTime类型(注意客户端时间和服务端时间差不能大于7秒,可以修改)
Nonce:随机数,字符串类型;
参数处理:
- 客户端用Token+ Timestamp+ Nonce后的字符串进行字典排序;
- 客户端将排序后的字符串进行MD5加密;
- 将加密后的字符串作为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的使用方法的更多相关文章
- 在ASP.NET MVC应用程序中实现Server.Transfer()类似的功能
在ASP.NET MVC应用程序中,如果使用Server.Transfer()方法希望将请求转发到其它路径或者Http处理程序进行处理,都会引发“为xxx执行子请求时出错”的HttpException ...
- ASP.NET MVC 3: Razor中的@:和语法
原文 ASP.NET MVC 3: Razor中的@:和语法 [原文发表地址] ASP.NET MVC 3: Razor’s @: and <text> syntax[原文发表时间] De ...
- ASP.NET MVC开发学习过程中遇到的细节问题以及注意事项
1.datagrid中JS函数传值问题: columns: { field: 'TypeName', title: '分类名称', width: 120, sortable: true, format ...
- 7.ASP.NET MVC 5.0中的Routing【路由】
大家好,这一篇向大家介绍ASP.NET MVC路由机制.[PS:上一篇-->6. ASP.NET MVC 5.0中的HTML Helpers[HTML帮助类] ] 路由是一个模式匹配系统,它确保 ...
- mvc的视图中显示DataTable的方法
mvc的视图中显示DataTable的方法: 不断的循环画出table @{ ViewBag.Title = "ShowDataTable"; } @using System.Da ...
- asp.net mvc 微信公众号token验证
本人的公众号要申请成为开发者,必须经过token认证.微信公众号的官方代码只列出了PHP代码的实例,明显是歧视.net用户.我用的asp.net mvc中的web api,结果调了好久都没有成功,最后 ...
- ASP.NET MVC AJAX 请求中加入 antiforgerytoken 解决“所需的防伪表单字段“__RequestVerificationToken”不存在”问题
在ASP.NET mvc中如果在表中使用了@Html.AntiForgeryToken(),ajax post不会请求成功 解决方法是在ajax中加入__RequestVerificationToke ...
- 如何在ASP.NET MVC和EF中使用AngularJS
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) AngularJS作为一个越来越流行的前端框架,在使用ASP.NET MVC和实体框架开发W ...
- ASP.NET MVC 4.0中选择Windows 验证默认出错拒绝访问的原因和解决方案
在VS 2012或者2013 中,根据模板创建一个ASP.NET MVC 4.0的应用程序,选择下面的模板 然后选择Intranet Application 不对源代码做任何修改,直接按下F5调试,会 ...
随机推荐
- 分享一下我封装iOS自定义控件的体会,附上三个好用的控件Demo <时间选择器&多行输入框&日期选择器>
前段时间有小伙伴问到我:"这样的控件该怎么做呢?",我感觉是个比较简单的控件,可能对于入行不久的同志思路没有很清晰吧.趁着最近工作不忙,就来这里分享一下我封装自定义控件的几点体会吧 ...
- WebGL on iOS8 终于等到了这一天
WWDC2014刚结束,这次的大会是名符其实的开发者大会,更贴切的应该说的确是一次软件开发者的大会,对于OSX和iOS的更多功能特性让人兴奋,Swift新语言促成了如上图片 但我更感兴趣的是WebGL ...
- .Net魔法堂:AssemblyInfo.cs文件详解
一.前言 .net工程的Properties文件夹下自动生成一个名为AssemblyInfo.cs的文件,一般情况下我们很少直接改动该文件.但我们实际上通过另一个形式操作该文件.那就是通过在鼠标右键点 ...
- IOS开发UI基础UIPikerView的属性
UIPikerView的属性 1. numberOfComponents:返回UIPickerView当前的列数NSInteger num = _pickerView.numberOfComponen ...
- React Native实践之携程Moles框架
编者:本文来自携程框架研发部高级经理魏晓军在第二期[携程技术微分享]上的分享,以下为整理后的文字实录.视频回放可点击这里.关注携程技术中心微信公号ctriptech,可获知更多微分享课程信息. 因为支 ...
- Sql Server来龙去脉系列 必须知道的权限控制基础篇
题外话:最近看到各种吐槽.NET怎么落寞..NET怎么不行了..NET工资低的帖子.我也吐槽一句:一个程序猿的自身价值不是由他选择了哪一门技术来决定,而是由他自身能创造出什么价值来决定. 在进入本篇内 ...
- 数论 --- 费马小定理 + 快速幂 HDU 4704 Sum
Sum Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=4704 Mean: 给定一个大整数N,求1到N中每个数的因式分解个数的 ...
- html5人物图片360度立体旋转
体验效果:http://hovertree.com/texiao/html5/10.htm 下载:http://hovertree.com/hvtart/bjae/t16oddyt.htm 代码如下: ...
- Java数字图像处理基础 - 必读
写了很多篇关于图像处理的文章,没有一篇介绍Java 2D的图像处理API,文章讨论和提及的 API都是基于JDK6的,首先来看Java中如何组织一个图像对象BufferedImage的,如图: 一个B ...
- LeetCode128:Longest Consecutive Sequence
题目: Given an unsorted array of integers, find the length of the longest consecutive elements sequenc ...