using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Caching;
using System.Text.RegularExpressions;
namespace WechatServ.Controllers
{
public class CacheManager
{
public static ObjectCache Cache
{
get
{
return MemoryCache.Default;
}
}
public static bool Contains(string key)
{
return Cache.Contains(key);
}
/// <summary>
/// Gets or sets the value associated with the specified key.
/// </summary>
/// <typeparam name="T">Type</typeparam>
/// <param name="key">The key of the value to get.</param>
/// <returns>The value associated with the specified key.</returns>
public static T Get<T>(string key)
{
return (T)Cache[key];
}
/// <summary>
/// Adds the specified key and object to the cache.
/// </summary>
/// <param name="key">key</param>
/// <param name="data">Data</param>
/// <param name="cacheTime">Cache time</param>
public static void Set(string key, object data, int cacheTime)
{
if (data == null)
return;
var policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);
Cache.Set(new CacheItem(key, data), policy);
}/// <summary>
/// Gets a value indicating whether the value associated with the specified key is cached
/// </summary>
/// <param name="key">key</param>
/// <returns>Result</returns>
public static bool IsSet(string key)
{
return (Cache.Contains(key));
}
/// <summary>
/// Removes the value with the specified key from the cache
/// </summary>
/// <param name="key">/key</param>
public static void Remove(string key)
{
Cache.Remove(key);
}
/// <summary>
/// Removes items by pattern
/// </summary>
/// <param name="pattern">pattern</param>
public static void RemoveByPattern(string pattern)
{
var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
var keysToRemove = new List<String>();
foreach (var item in Cache)
if (regex.IsMatch(item.Key))
keysToRemove.Add(item.Key);
foreach (string key in keysToRemove)
{
Remove(key);
}
}
/// <summary>
/// Clear all cache data
/// </summary>
public static void Clear()
{
foreach (var item in Cache)
Remove(item.Key);
}
}
}
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Web.Http;
using Newtonsoft.Json.Linq;
namespace WechatServ.Controllers
{
[RoutePrefix("api/Gettokenservice")]
public class AuthenticationController : ApiController
{
/// <summary>
/// 获取token
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
[HttpPost, Route("gettoken")]
public JObject GetToken([FromBody] JObject data)
{
string key = data["key"].ToString();
JObject result = new JObject();
result["Code"] = "-2";
result["Msg"] = "key不存在!";
result["Token"] = string.Empty;
if (!string.IsNullOrEmpty(key.ToString()))
{
//验证key是否存在
bool flag = false;
string keys = System.Configuration.ConfigurationManager.AppSettings["allowKeys"];
foreach(var s in keys.Split(','))
{
if(s==key)
{
flag = true;
}
}
//using (IDbConnection con = DBProvider.GetSqlConnection())
//{
// con.Open();
// var user = con.Query("select * from [Company] where AbbreviationName=@shortName and Appkey=@key", new { shortName = shortName, key = key });
// //var user = con.Query("select * from api_developers ");
// if (user != null && user.ToList().Count > 0)
// {
// flag = true;
// }
// else
// {
// result["Msg"] = "企业和appkey不存在";
// LogManager.ErrorLog(result["Msg"].ToString());
// }
// con.Close();
//}
if (flag)
{
result["Code"] = "0";
result["Msg"] = "success!";
result["Token"] = GetMD5(key.ToString()+DateTime.Now.ToString("yyyyMMddHHmmss"));
//写入缓存
CacheManager.Set(key.ToString(), result["Token"].ToString(), 120);
}
}
else
{
result["Msg"] = "key不存在!";
// LogManager.ErrorLog(result["Msg"].ToString());
}
return result;
}
///C#生成MD5的方法
public static string GetMD5(string sDataIn)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] bytValue, bytHash;
bytValue = System.Text.Encoding.UTF8.GetBytes(sDataIn);
bytHash = md5.ComputeHash(bytValue);
md5.Clear();
string sTemp = "";
for (int i = 0; i < bytHash.Length; i++)
{
sTemp += bytHash[i].ToString("X").PadLeft(2, '0');
}
return sTemp.ToLower();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.IO;
using System.Net.Http;
using System.Net;
using Newtonsoft.Json.Linq;
using System.Data;
using System.Data.SqlClient;
namespace WechatServ.Controllers
{
public class OAuthFilter : ActionFilterAttribute
{
/// <summary>
/// OnActionExecuting是Action运行前的操作
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(HttpActionContext context)
{
string msg=string.Empty;
var key = HttpContext.Current.Request.Headers["key"] ?? "";
var old_token = HttpContext.Current.Request.Headers["token"] ?? "";
//var data = (JObject) context.ActionArguments["data"]; //context.Request.Properties["key"].ToString();
//var key =data["key"]!=null? data["key"].ToString():"";
//var old_token =data["token"]!=null? data["token"].ToString():"";// context.ActionArguments["token"].ToString();
//判断token是否存在
string token = CacheManager.Get<string>(key);
if (string.IsNullOrEmpty(token) || token != old_token)
{
msg="错误的token!";
// LogManager.ErrorLog("key:" + key + "|token:" + token + "|msg:" + msg);
context.Response = new HttpResponseMessage(HttpStatusCode.OK);
context.Response.Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(new { code = -1, msg = msg }));
}
}
}
public class OAuthOrderFilter :ActionFilterAttribute
{
/// <summary>
/// OnActionExecuting是Action运行前的操作
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(HttpActionContext context)
{
var data = (JObject)context.ActionArguments["data"]; //context.Request.Properties["key"].ToString();
var key = data["key"].ToString();
var old_token = data["token"].ToString();// context.ActionArguments["token"].ToString();
string companyKeys = System.Configuration.ConfigurationManager.AppSettings["OrderApiCompanyKeys"].ToString();
bool flag = false;
foreach (var k in companyKeys.Split(','))
{
if (key == k)
{
flag = true;
}
}
if (flag)
{
//判断token是否存在
string token = CacheManager.Get<string>(key);
if (string.IsNullOrEmpty(token) || token != old_token)
{
context.Response = new HttpResponseMessage(HttpStatusCode.OK);
context.Response.Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(new { code = -1, msg = "错误的token!" }));
}
}
else
{
context.Response = new HttpResponseMessage(HttpStatusCode.OK);
context.Response.Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(new { code = -1, msg = "此key不允许访问!" }));
}
}
}
}