SASToken
请求的时候
string appid = "appid"; string appkey = "123132132132312"; string token = CommonAPI.CreateSASToken(appid, appkey, TimeSpan.FromSeconds(120)); string url = "xxxxx" + "?" + token;
方法
public static string CreateSASToken(string appid, string appkey, TimeSpan timeout) { var values = new Dictionary<string, string> { { "once", CreateRandCode(8) }, { "appid", appid }, { "expiry", (DateTimeOffset.UtcNow + timeout).ToUnixTimeSeconds().ToString() } }; //给values里的key值排序 var signContent = string.Join("", values.OrderBy(pair => pair.Key).Select(pair => pair.Key + pair.Value)); string sign; using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(appkey))) { sign = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(signContent))); } //var para = string.Join("&", values.OrderBy(pair => pair.Key).Select(pair => $"{pair.Key}={HttpUtility.UrlEncode(pair.Value)}")); var para = string.Join("&", values.OrderBy(pair => pair.Key).Select(pair => pair.Key + "=" + HttpUtility.UrlEncode(pair.Value))); //return $"{para}&token={HttpUtility.UrlEncode(sign)}"; return para + "&token=" + HttpUtility.UrlEncode(sign); } private static int Random(int maxValue) { RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); decimal _base = (decimal)long.MaxValue; byte[] rndSeries = new byte[8]; rng.GetBytes(rndSeries); return (int)(Math.Abs(BitConverter.ToInt64(rndSeries, 0)) / _base * maxValue); } public static string CreateRandCode(int codeLen) { string keySet = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int keySetLength = keySet.Length; StringBuilder str = new StringBuilder(keySetLength); for (int i = 0; i < codeLen; ++i) { str.Append(keySet[Random(keySetLength)]); } return str.ToString(); }
验证Token
public async Task<ActionResult> ActionName(string appid, string expiry, string once, string token, Models.Student student) { var keyname = new string[]{"appkey"}; var setting = _db.BaseSetting.Where(p => p.AppId == $"{appid}" &&keyname.Contains(p.KeyName)).ToDictionary(p => p.KeyName, p => p.KeyValue); var appkey=setting["appkey"]; //Validate Token if (ValidateSASToken(appid,appkey, expiry, once, token) == false) throw new Exception($"token错误!"); }
public static bool ValidateTimeout(string UnixTimeSec) { DateTimeOffset sdate = DateTimeOffset.UtcNow; DateTimeOffset edate = sdate.AddMinutes(TokenTimeOutMinute); DateTimeOffset mydate = DateTimeOffset.FromUnixTimeSeconds(Convert.ToInt32(UnixTimeSec)); if (mydate >= sdate && mydate <= edate) { return true; } else return false; } public static Boolean ValidateSASToken(string appid, string appkey, string expiry, string once, string token) { if (ValidateTimeout(expiry)) { var values = new Dictionary<string, string> { { "once", once }, { "appid", appid }, { "expiry", expiry } }; var signContent = string.Join("", values.OrderBy(pair => pair.Key).Select(pair => pair.Key + pair.Value)); string sign; using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(appkey))) { sign = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(signContent))); } return token == sign; } else return false; }
其实这个token的验证的方法不是那么的麻烦:
请求方请求的Values 的值,带过来在服务端根据Values再重新生成一下,
然后对比:请求端的token是否等于在服务端重新生成的token,如此对比。
时间戳:
人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· 语音处理 开源项目 EchoSharp
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 使用 Dify + LLM 构建精确任务处理应用