ASP.NET MVC 在WebService中Token的使用方法
接口: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秒后则自动失效;
转载于:https://www.cnblogs.com/jiayc/p/10149016.html
ASP.NET MVC 在WebService中Token的使用方法相关推荐
- 在ASP.NET MVC应用程序中实现Server.Transfer()类似的功能
在ASP.NET MVC应用程序中,如果使用Server.Transfer()方法希望将请求转发到其它路径或者Http处理程序进行处理,都会引发"为xxx执行子请求时出错"的Htt ...
- 关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】
关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 [持续更新] 参考文章: (1)关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 [持续更新] (2)https://www. ...
- html里面的view怎么修改,asp.net mvc 3-在局部视图中修改MVC 3 ViewBag不会保留到_Layout.cshtml...
asp.net mvc 3-在局部视图中修改MVC 3 ViewBag不会保留到_Layout.cshtml 我在Razor视图引擎中使用了MVC 3. 我想在局部视图的ViewBag中设置一些值,并 ...
- asp html表单没有csrf保护,ASP.NET MVC 和网页中的 XSRF/CSRF 防护
ASP.NET MVC 和网页中的 XSRF/CSRF 防护 03/14/2013 本文内容 跨站点请求伪造(也称为 XSRF 或 CSRF)是一种针对 Web 托管型应用程序的攻击,恶意网站凭此可以 ...
- asp.net+mvc+html辅助,ASP.NET MVC使用Ajax的辅助的解决方法
前言:前面我们已经简单的介绍过了MVC如何Jquery,因为我们如果使用Ajax的话必须要了解Jquery,这篇博客我们将大致了解一下ASP.NET MVC如何使用Ajax的辅助方法,此博客是我的读书 ...
- mvc的视图中显示DataTable的方法
mvc的视图中显示DataTable的方法: 不断的循环画出table @{ViewBag.Title = "ShowDataTable"; } @using System.Dat ...
- 如何在FineUIMvc(ASP.NET MVC)视图中绑定多个模型?
起因 这是知识星球内的一个网友提出的,按理说ASP.NET MVC中一个视图只能绑定一个模型(Model),在视图顶部标识如下: @model IEnumerable<FineUICore.Ex ...
- 解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题
问题背景: 在使用asp.net mvc 结合jquery esayui做一个系统,但是在使用使用this.json方法直接返回一个json对象,在列表中显示时发现datetime类型的数据在转为字符 ...
- ASP.NET MVC 自定义路由中几个需要注意的小细节
本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...
最新文章
- Flatten Nested Arrays(展平嵌套数组)
- 【codeforces 508B】Anton and currency you all know
- 不完整类型(partial type)
- 万万没想到,刷1000道题目,还不如搞懂这几个机械动图!
- 由「Metaspace容量不足触发CMS GC」从而引发的思考
- 高考封路,大叔骑车强闯
- Java知识点总结(Java容器-ArrayList)
- java Object类的公共方法
- JPG在线压缩工具分享
- PROTEL技术大全
- 苹果pencil和普通的有什么区别?推荐好用的平替笔
- 盲打打字php,盲打26键打字口诀是什么
- NFTScan x TiDB丨一栈式 HTAP 数据库为 Web3 数据服务提供毫秒级多维查询
- 理想电压源的内阻是0,理想电流源的内阻是无穷大
- Heuristics for Scalable Dynamic Test Generation
- 知易行难的 “目标管理法”
- 使用python实现一个简单的学生信息管理系统
- WMS与TMS实施流程
- Swin Transformer猫狗分类
- 1905协议详解(三)基于IEEE Std1905.1的IEEE802.1 access point autoconfiguration 协议和Link metrics
热门文章
- 练习图200例图纸讲解_建筑安装工程图例及符号手册,最全数据整理,施工图纸从此无忧...
- 这是我见过最全面的Python装饰器详解 没有学不会这种说法
- 收藏 | 人人都能看懂的LSTM介绍及反向传播算法推导
- 太赞了!避免掉坑!佐治亚理工21页优雅读博指南
- 最新8篇ICML2020投稿论文:自监督学习、联邦学习、图学习、数据隐私、语言模型、终身学习...
- TensorFlow会话的配置项
- Python-cvxopt库的使用(1)(解决LP问题)
- 电子认证服务许可证企业名单_工信部注销28家企业跨地区增值电信业务经营许可证...
- 安卓怎么把一个按钮设计成梯形_电气控制电路与PLC之间的梯形图转化,挺实用!...
- ode45 matlab 出错,请问,Matlab用ODE45解微分方程,出错