|
=================用下面这个======================
=======================================
代码都是自己写的,网上找不到的!!!!
不多说,先上web.config的配置:
- <add key="AppKey" value="c4ca4238a0b923820dcc509a6f75849b" />
- <add key="TimestampInterval" value="10"/>
复制代码 appkey是通信密钥,TimestampInterval是时间戳允许的时间差。
下面是签名过滤器:
- /// <summary>
- /// 签名过滤器
- /// </summary>
- public class SignatureAttribute : ActionFilterAttribute
- {
- /// <summary>
- /// 进入api之前
- /// </summary>
- /// <param name="actionContext"></param>
- public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
- {
- base.OnActionExecuting(actionContext);
- SortedDictionary<string, string> requestDic = new SortedDictionary<string, string>();
- var QueryString = ((HttpContextBase)actionContext.Request.Properties["MS_HttpContext"]).Request.QueryString;
- foreach (var item in QueryString.AllKeys)
- {
- //key都转为小写,防止在取key的时候出错
- requestDic.Add(item.Trim().ToLower(), QueryString[item]);
- }
- //时间戳timestamp 随机数nonce 签名signature
- if (requestDic.Keys.Any(m => m.Equals("timestamp")) && requestDic.Keys.Any(m => m.Equals("nonce")) && requestDic.Keys.Any(m => m.Equals("signature")))
- {
- //先判断时间戳
- long time = long.Parse(requestDic["timestamp"]);
- if (TimeHelp.IsTime(time, Convert.ToDouble(ConfigurationManager.AppSettings["TimestampInterval"])))
- {
- SignHelper sign = new SignHelper(ConfigurationManager.AppSettings["AppKey"]);
- bool result = sign.IsSign(requestDic);
- if (!result)
- {
- actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, new ResultMessage<object>() { result = false, message = "签名不正确" });
- }
- }
- else {
- actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, new ResultMessage<object>() { result = false, message = "时间戳不正确" });
- }
- }
- else {
- actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, new ResultMessage<object>() { result = false, message = "缺少参数" });
- }
- }
- }
复制代码
然后,返回的实体model类,代码如下:
- /// <summary>
- /// 统一返回实体
- /// </summary>
- /// <typeparam name="Entity"></typeparam>
- [Serializable]
- [DataContract]
- public class ResultMessage<Entity>
- {
- [DataMember]
- public bool result { get; set; }
- [DataMember]
- public int code { get; set; }
- [DataMember]
- public string message { get; set; }
- [DataMember]
- public Entity data { get; set; }
- }
复制代码
最后,附上时间戳和签名验证的方法:
|
上一篇:System.Net.Http.HttpRequestMessage”不包含“CreateResponse”的定义下一篇:找不到包含 OwinStartupAttribute 的程序集
|