Common

  public interface ICacheWriter
{
void AddCache(string key, object value, DateTime expDate);
void AddCache(string key, object value);
object GetCache(string key);
T GetCache<T>(string key);
void SetCache(string key, object value, DateTime extDate);
void SetCache(string key, object value);
}

ICacheWriter

 public class CacheHelper
{
public static ICacheWriter CacheWriter { get; set; } static CacheHelper()
{
CacheWriter = new MemcacheWriter();
}
public static void AddCache(string key, object value, DateTime expDate)
{
CacheWriter.AddCache(key, value, expDate);
}
public static void AddCache(string key, object value)
{
CacheWriter.AddCache(key, value);
} public static object GetCache(string key)
{
return CacheWriter.GetCache(key);
} public static void SetCache(string key, object value, DateTime extTime)
{
CacheWriter.SetCache(key, value, extTime);
} public static void SetCache(string key, object value)
{
CacheWriter.SetCache(key, value);
}
}

CacheHelper

  public class MemcacheWriter : ICacheWriter
{
private MemcachedClient memcachedClient;
public MemcacheWriter()
{
string strAppMemcachedServer = System.Configuration.ConfigurationManager.AppSettings["MemcachedServerList"];
string[] servers = strAppMemcachedServer.Split(','); //初始化池
SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(servers);
pool.InitConnections = ;
pool.MinConnections = ;
pool.MaxConnections = ;
pool.SocketConnectTimeout = ;
pool.SocketTimeout = ;
pool.MaintenanceSleep = ;
pool.Failover = true;
pool.Nagle = false;
pool.Initialize(); MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
mc.EnableCompression = false; memcachedClient = mc;
} public void AddCache(string key, object value, DateTime expDate)
{
memcachedClient.Add(key, value, expDate);
} public void AddCache(string key, object value)
{
memcachedClient.Add(key, value);
} public object GetCache(string key)
{
return memcachedClient.Get(key);
} public T GetCache<T>(string key)
{
return (T)memcachedClient.Get(key);
}
public void SetCache(string key, object value, DateTime extDate)
{
memcachedClient.Set(key, value, extDate);
} public void SetCache(string key, object value)
{
memcachedClient.Set(key, value);
}
}

MemcacheWriter

   public static class Utils
{
#region GetSHA1(string str) #
public static string GetSHA1(string str)
{
byte[] cleanBytes = Encoding.Default.GetBytes(str);
byte[] hashedBytes = System.Security.Cryptography.SHA1.Create().ComputeHash(cleanBytes);
return BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();
}
#endregion
}

Utils

WebAPIService

    #region 获取授权的TOKEN
/// <summary>
/// 获取授权的TOKEN
/// </summary>
/// <param name="userId">当前用户ID</param>
/// <returns></returns>
[AcceptVerbs("GET")]
public IHttpActionResult GetTokenResult()
{
long timeStamp = DateTime.Now.ConvertTimestamp();
try
{
string token = Guid.NewGuid().ToString("N");
_msg = new Message()
{
retcode = ,
resTime = timeStamp,
toKen = token,
retmsg = "成功"
};
//缓存到memcached 用户的TOKEN 失效时间是一分钟
CacheHelper.SetCache(token, token, DateTime.Now.AddMinutes());
var toek = CacheHelper.GetCache(token);
}
catch
{
_msg = new Message() { retcode = -, resTime = timeStamp, retmsg = "获取TOKEN失败!" };
}
return Json(_msg);
}
#endregion private bool IsValideLogin(UserLoginInfo userLoginInfo, out Message msg)
{
msg = null;
bool result = false;
long timeStamp = DateTime.Now.ConvertTimestamp();
try
{
//采用DES+KEY 对数据加密 //从memcached 获取用户的授权令牌进行匹配,如果匹配上说明身份已经验证过,无需要二次验证损耗性能
var _sign = CacheHelper.GetCache(userLoginInfo.userId.ToString(CultureInfo.InvariantCulture));
if (_sign != null && !string.IsNullOrEmpty(_sign.ToString()))
{
if (!string.IsNullOrEmpty(userLoginInfo.SIGN) &&
userLoginInfo.SIGN.Equals(_sign.ToString(), StringComparison.OrdinalIgnoreCase))
{
result = true;
}
} //1.从memcached 读取用户的token 检查token 是否授权
var _token = CacheHelper.GetCache(userLoginInfo.TOKEN);
if (_token != null && !string.IsNullOrEmpty(_token.ToString()))
{
//模拟读取数据库已配置的key密钥
string key = "cvuUldfieEULqfjdi92k1-lsdf#*ksdf2jd@ld0"; string userId = userLoginInfo.userId.ToString();
string timeStamps = userLoginInfo.timeStamp.ToString(); //3.SHA1加密匹配参数是否正确
string[] temps = { userId, timeStamps, key, _token.ToString() };
Array.Sort(temps);
string sign = Utils.GetSHA1(string.Join("", temps));
if (!string.IsNullOrEmpty(userLoginInfo.SIGN) &&
sign.Equals(userLoginInfo.SIGN, StringComparison.OrdinalIgnoreCase))
{
result = true;
//设置到memcache 设置有效期为1天时间 授权的临时令牌 分发给用户
//这里可以使用DES加密过的串分发给用户 DES+KEY
CacheHelper.SetCache(userLoginInfo.userId.ToString(CultureInfo.InvariantCulture), sign, DateTime.Now.AddDays());
}
else
{
msg = new Message() { resTime = timeStamp, retcode = -, retmsg = "身份验证失败,非法请求!" };
return result = false;
}
}
else
{
msg = new Message() { resTime = timeStamp, retcode = -, retmsg = "非法请求,未授权的TOKEN" };
return result = false;
}
}
catch
{
msg = new Message() { resTime = timeStamp, retcode = , retmsg = "身份验证服务出错!" };
return result = false;
}
return result;
}

ValuesController

WebAPIClient

    RestClient client = new RestClient("http://192.168.64.231:32768");

             UserLoginInfo User = new UserLoginInfo();

             #region Get 方式请求列表
string str = client.Get("api/values");
Message msg = JsonConvert.DeserializeObject<Message>(str); string userId = "";
string timeStamp = msg.resTime.ToString();
string key = "cvuUldfieEULqfjdi92k1-lsdf#*ksdf2jd@ld0";
string[] temps = { userId, timeStamp, key, msg.toKen };
Array.Sort(temps);
string sign = Utils.GetSHA1(string.Join("", temps)); //1.获取授权的TOKEN
User.userId = userId;
User.TOKEN = msg.toKen;
User.SIGN = sign;
User.timeStamp = msg.resTime.ToString(); Console.WriteLine(str);
#endregion #region Post 方式 添加数据 string postUri = "api/values/1"; //string userJson = @"{""Id"":123,""Age"":12,""UserInfo"":""111""}";
string userJson = JsonConvert.SerializeObject(User);
string postResponse = client.Post(userJson, postUri); Console.WriteLine(postResponse);
#endregion Console.ReadKey();

Program

WebAPI接口调用身份验证的更多相关文章

  1. Java后端API调用身份验证的思考

    在如今信息泛滥的数字时代中对产品安全性的要求越来越高了,就比如说今天要讨论的Java后端API调用的安全性,在你提供服务的接口中一定要保证调用方身份的有效性和合法性,不能让非法的用户进行调用,避免数据 ...

  2. 使用ASP.NET Identity 实现WebAPI接口的Oauth身份验证

    使用ASP.NET Identity 实现WebAPI接口的Oauth身份验证   目前WEB 前后端分离的开发模式比较流行,之前做过的几个小项目也都是前后分离的模式,后端使用asp.net weba ...

  3. 基于JWT的web api身份验证及跨域调用实践

    随着多终端的出现,越来越多的站点通过web api restful的形式对外提供服务,很多网站也采用了前后端分离模式进行开发,因而在身份验证的方式上可能与传统的基于cookie的Session Id的 ...

  4. c# WebApi之身份验证:Basic基础认证

    为什么需要身份认证 身份认证是为了提高接口访问的安全性,如果没有身份验证,那么任何匿名用户只要知道服务器的url,就可以随意访问服务器,从而访问或者操作数据库,这会是很恐怖的事. 什么是Basic基础 ...

  5. Nginx集群之基于Redis的WebApi身份验证

    目录 1       大概思路... 1 2       Nginx集群之基于Redis的WebApi身份验证... 1 3       Redis数据库... 2 4       Visualbox ...

  6. ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证

    ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...

  7. MVC - 身份验证

    FormsAuthenticationTicket  使用此类来为用户生成一个身份票据 持有该票据则说明该用户是通过了身份验证的用户 可以随时访问某些资源 我们先创建几个类 //用户 public c ...

  8. 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权

    OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...

  9. 教你如何实现微信小程序与.net core应用服务端的无状态身份验证

    随着.net core2的发布,越来越多人使用.net core2开发各种应用服务端,下面我就结合自己最近开发的一款小程序,给大家分享下,怎么使用小程序登录后,小程序与服务端交互的权限控制. .net ...

随机推荐

  1. perl 二维数组

    perl没有真正的二维数组,所谓的二维数组其实是把一维数组以引用的方式放到另外一个一维数组. 二维数组定义 : my @array1=([1,2],[3,4],[45,9],[66,-5]);     ...

  2. 向数据库中全部表中增加一个字段的SQL

    SELECT 'ALTER TABLE ' + NAME + ' ADD 字段名 int not null default 0' FROM sysobjects AS sWHERE s.[type] ...

  3. [Android]检查当前手机是否有网络

    // Check network connection private boolean isNetworkConnected(){ ConnectivityManager connectivityMa ...

  4. Effective C++ -----条款21:必须返回对象时,别妄想返回其reference

    绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个loc ...

  5. Mathematics:Semi-prime H-numbers(POJ 3292)

      Semi-prime H-numbers 题目大意,令4n+1的数叫H数,H数素数x的定义是只能被x=1*h(h是H数),其他都叫合数,特别的,当一个数只能被两个H素数乘积得到时,叫H-semi数 ...

  6. BestCoder25 1001.Harry and Magical Computer(hdu 5154) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5154 题目意思:有 n 门 processes(编号依次为1,2,...,n),然后给出 m 种关系: ...

  7. func 和 actin 委托的区别

    一.[action<>]指定那些只有输入参数,没有返回值的委托 1.1定义一个委托: 比如,我们原来写委托: public delegate void myDelegate(string  ...

  8. 【mysql】利用Navicat for MySQL的使用

    1. 查看sql语句 如果忘记了某个SQL语句怎么写,可以利用Navicat for MySQL的历史日志来查看 在Navicat for MySQL中,直接对数据库进行想要的操作,然后点击工具-&g ...

  9. 20145213《Java程序设计》实验五Java网络编程及安全

    20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...

  10. C#封装C++DLL

    1.新建一个C#-Windows-类库(用于创建C#类库(.dll)的项目)类型的工程 2.对于普通C++函数 XXXX_API void cppFun(int i); 在cs代码中添加 [DllIm ...