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 ...
随机推荐
- MySQL表中数据的迁移
INSERT INTO `crm_attachment`(OPERATOR_ID,ATTACHMENT_ID,TYPE ) SELECT APPLICATION_ID ,ATTACHMENT_ID,' ...
- ffmpeg-20160520-git-bin
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...
- metro中stream转IRandomAccessStream
下面的例子是从zip压缩文件解压出jpg文件流,再显示出来. StorageFile zip = await KnownFolders.PicturesLibrary.GetFileAsync(&qu ...
- Django环境搭建
1.安装好Python 2.7.10 2.下载解压Django Django-1.9.2.tar.gz cmd cd到解压缩目录(***) python setup.py install 3.检测是否 ...
- webpack学习笔记一
主要参考: https://blog.madewithlove.be/post/webpack-your-bags/ 起因: 作为运维狗, 对前端一窍不通但心向往之, 最近做一个Dashboard, ...
- nyoj756_重建二叉树_先序遍历
重建二叉树 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数 ...
- IOS-在ARC项目中使用非ARC框架或者类库
1.在ARC项目中使用非ARC框架或者类库 IOS 4引入了Automatic Reference Count(ARC),编译器可以在编译时对obj-c对象进行内存管理. 之前,obj-c的内存管理方 ...
- Oracle双实例切换
1.在Linux下切换: export ORACLE_SID=xxx1 sqlplus "/as sysdba" //进入sql startup //启动数据库实例1 ...
- poj1733(种类并查集+离散化)
题目链接: http://poj.org/problem?id=1733 题意: 输入n表示有一个长度为n的0,1字符串, m表示接下来有m行输入, 接下来的m行输入中x, y, even表示第x到第 ...
- nyoj998(euler)
题意:题意:给出n和m,求满足条件gcd(x, n)>=m的x的gcd(x, n)的和,其中1<=x<=n,1<= n, m <= 1e9:思路:此题和nyoj1007差 ...