WebAPI接口调用身份验证
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接口调用身份验证的更多相关文章
- Java后端API调用身份验证的思考
在如今信息泛滥的数字时代中对产品安全性的要求越来越高了,就比如说今天要讨论的Java后端API调用的安全性,在你提供服务的接口中一定要保证调用方身份的有效性和合法性,不能让非法的用户进行调用,避免数据 ...
- 使用ASP.NET Identity 实现WebAPI接口的Oauth身份验证
使用ASP.NET Identity 实现WebAPI接口的Oauth身份验证 目前WEB 前后端分离的开发模式比较流行,之前做过的几个小项目也都是前后分离的模式,后端使用asp.net weba ...
- 基于JWT的web api身份验证及跨域调用实践
随着多终端的出现,越来越多的站点通过web api restful的形式对外提供服务,很多网站也采用了前后端分离模式进行开发,因而在身份验证的方式上可能与传统的基于cookie的Session Id的 ...
- c# WebApi之身份验证:Basic基础认证
为什么需要身份认证 身份认证是为了提高接口访问的安全性,如果没有身份验证,那么任何匿名用户只要知道服务器的url,就可以随意访问服务器,从而访问或者操作数据库,这会是很恐怖的事. 什么是Basic基础 ...
- Nginx集群之基于Redis的WebApi身份验证
目录 1 大概思路... 1 2 Nginx集群之基于Redis的WebApi身份验证... 1 3 Redis数据库... 2 4 Visualbox ...
- ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证
ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...
- MVC - 身份验证
FormsAuthenticationTicket 使用此类来为用户生成一个身份票据 持有该票据则说明该用户是通过了身份验证的用户 可以随时访问某些资源 我们先创建几个类 //用户 public c ...
- 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权
OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...
- 教你如何实现微信小程序与.net core应用服务端的无状态身份验证
随着.net core2的发布,越来越多人使用.net core2开发各种应用服务端,下面我就结合自己最近开发的一款小程序,给大家分享下,怎么使用小程序登录后,小程序与服务端交互的权限控制. .net ...
随机推荐
- Unity3d《Shader篇》漫反射
Unity3d<Shader篇>漫反射 Shader "Custom/Ambient" { Properties { _MainTex ("Base (RGB ...
- ios oc 和 swfit 用dispatch_once 创建单例
网上已经有方法了,我这里就是抄了下,原文链接 http://bj007.blog.51cto.com/1701577/649413 http://blog.csdn.net/u010124617/ar ...
- 《Java语言程序设计》上机实验
实验一 Java环境演练 [目的] ①安装并配置Java运行开发环境: ②掌握开发Java应用程序的3个步骤:编写源文件.编译源文件和运行应用程序: ③学习同时编译多个Java源文件. [内容 ...
- ABAP 权限程序
检查用户销售区域与分销渠道的权限 AUTHORITY-CHECK OBJECT 'V_VBAK_VKO' ID 'VKORG' FIELD wa_all-vkorg ID 'V ...
- 【linux】学习3
鸟哥 书的第7章 从 /home/dtest1 跳入 /home/dtest2 目录: cd ../dtest2 注意 cd后有空格 ..后无空格 特殊目录: . 代表此层目录 .. ...
- linux日常易忘指令
1.编辑全局指令 进入~/.bash_profile 增加"exprot +(启动文件的地址)" source ~/.bash_profilr(刷新) 2.修改mysql密码 my ...
- Java Socket编程题库
一. 填空题 ___ IP地址____用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 统一资源定位符URL是指向互联网"资源"的指针,由4部分组成:协议 ...
- August 11th 2016, Week 33rd Thursday
A particular fine spring came around. 转眼又是一番分外明媚的春光. Hey, it is hot outside, sometimes even unbearab ...
- 浅析 - 提高xib(Interface Builder)高效工作的几个小技巧
本文译自:8 Tips for working effectively with Interface Builder(需FQ)先来看看目录:介绍使view的Size与view中的Content相适应按 ...
- NYOJ题目65另一种阶乘问题
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsIAAAJhCAIAAADE+EHOAAAgAElEQVR4nO3drXLjSAMu4HMT4bmQYF