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调试,会 ...
随机推荐
- 如何使用DDMS Heap查看Android应用内存情况
作为大四毕业生,而且还是二本,加上技术基础不咋样,找工作自然也是辛酸得很...最糟糕的情况就是一开始实在是太小看了求职之路的艰辛,整个9月都是无所事事的度过,直到月底面试腾讯被鄙视后才顿然醒悟,意识到 ...
- JavaScript 中变量、作用域和内存问题的学习
这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScrip ...
- SpringMVC核心——参数获取与Servlet资源获取问题
一.SpringMVC 使用 @PathVariable.@RequestParam.@RequestHeader.@CookieValue 等来解决参数获取问题. 1. @PathVariable: ...
- 复利程序(c语言)(张俊毅 周修文)
因为之前发烧一直没有了解这个 所以最近才补上 分数扣了就扣了 补上先 单元测试迟点更 #include<stdio.h> #include <math.h> #include ...
- Android读写SD卡
SD卡的读写是我们在开发Android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式: 1. 获取SD卡的根目录 String sdCardRoot = Environment.getEx ...
- Winform屏幕截图保存C#代码
代码如下: using System.Runtime.InteropServices; using System.Drawing.Imaging; [System.Runtime.InteropSer ...
- ASP.Net中无刷新执行Session身份验证
在写一个客户的B/S结构应用程序时,突然发现一个技巧,不知道是否是MS的一个BUG,给相关的有研究的朋友原先考虑写一个检查Session的类,Session失效后,必须转向登陆页面,可每一个调用该类的 ...
- 重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制
[源码下载] 重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台 ...
- Interlocked.CompareExchange
class SourceManager { private SourceManager() { } private static SourceManager sourceManager; public ...
- web ppt
先记录,以后再试试 https://github.com/gnab/remark/wiki http://segmentfault.com/blog/sweetdum/1190000000484121 ...