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 ...
随机推荐
- Django~学习计划
20160302 Excel,PDF 处理 GeoDjango学习:GIS编程,百度地图 Javascript 邮件系统 图像处理
- Python缩小图像
LyncLynn用途: 缩小图像 # -*- coding: UTF-8 -*- #Version: V1.0 #Author:lynclynn #CreateDate:20151201 #Updat ...
- Vue 为什么在 HTML 中监听事件?
为什么在 HTML 中监听事件? 你可能注意到这种事件监听的方式违背了关注点分离(separation of concern)传统理念.不必担心,因为所有的 Vue.js 事件处理方法和表达式都严格绑 ...
- Mysql 基础3
1. 逗号是个好东西2.对于多条件查询 和范围查询 的灵活运用(and 和or 的灵活运用)in 用的时候注意 补充select * from car where name like '%奥迪%' a ...
- HTML 样式表
样式代码 样式代码与属性代码区别 样式代码必须带单位 属性不需要 多个样式代码之间用分号隔开 同一个样式里面 用空格 多个属性之间用空格隔开 举例 1.背景样式 .r { backgr ...
- iOS 没有安装对应客户端,不应显示对应的图标
现在很多APP为了让用户更加快捷方便注册,都会使用第三方进行登录,例如QQ/微信/淘宝等.但是上线审核被拒,大致会出现以下内容: Additionally, we found that your ap ...
- 让ar执行queryall和queryrow方法返回数组
让ar执行queryall和queryrow方法返回数组 <?phpnamespace common\components;use \CActiveRecord;use \Yii;use \CD ...
- ASIHTTPRequest详解 [经典3]
大文件断点续传 0.94 以后支持大文件的断点下载,只需要设置: [ request setAllowResumeForFileDownloads:YES ]; [ request setDownlo ...
- asp.net DataSet数据导出到Excel中
方法: [STAThread]///这是必须的 public override void VerifyRenderingInServerForm(System.Web.UI.Control co ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(三) 之 实现单聊,群聊,发送图片,文件。
上篇讲解了如何搭建聊天服务器,以及客户端js怎么和layui的语法配合.服务器已经连接上了,那么聊天还会远吗? 进入正题,正如上一篇提到的我们用 Client.Group(groupId)的方法向客户 ...