阿里云openapi签名实现代码(基于C#)

简介: 部分开发者在接触阿里云openAPi调用的时候,Signature的构造和生成一直都是一只拦路虎,本文中将基于C#,和点播的APi:getPlayAuth 实现签名的构造,仅供大家参考。

image.png

代码正文如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;

namespace openapiSignature
{
    class MainClass
    {
        private String Format = "JSON";
        private String Version = "2017-03-21";
        private String AccessKeyId = "yourAccessKeyID";
        private String SignatureMethod = "HMAC-SHA1";
        private String SignatureVersion = "1.0";
        private Dictionary<string, string> publicParams;

        public void setPublicParams(Dictionary<string,string>dic)
        {
            publicParams = dic;
        }
        public Dictionary<string, string> getPublicParams()
        {
            return publicParams;
        }
        public String getFormat()
        {
            return Format;
        }
        public String getVersion()
        {
            return Version;
        }
        public String getAccessKeyId()
        {
            return AccessKeyId;
        }
        public String getSignatureMethod()
        {
            return SignatureMethod;
        }
        public String getSignatureVersion()
        {
            return SignatureVersion;
        }
        public String getTimestamp()
        {
            String now = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
            return now;
        }
        public String getSignatureNonce()
        {
            return System.Guid.NewGuid().ToString();
        }
        public String getAccessKeySecret()
        {
            return "yourAccessKeySecret";
        }
        /**
         * URL编码
         */
        public static string UrlEncode(string temp)
        {
            Encoding encoding = System.Text.Encoding.UTF8;
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < temp.Length; i++)
            {
                string t = temp[i].ToString();
                string k = HttpUtility.UrlEncode(t, encoding);
                if (t == k)
                {
                    stringBuilder.Append(t);
                }
                else
                {
                    stringBuilder.Append(k.ToUpper());
                }
            }
            return stringBuilder.ToString();
        }
        /**
         * 对urlencode之后的字符串进行特殊字符检测和替换
         */
        public static string checkParam(string str)
        {
            
            if(str.Contains("+"))
            {
                str.Replace("+","%20");
            }else if(str.Contains("*"))
            {
                str.Replace("*", "%2A");
            }
            else if (str.Contains("%7E"))
            {
                str.Replace("%7E","~");
            }
            return str;
        }
        /**
         * 计算Hmacsha1
         */
        public static string HmacSha1Sign(string text, string key)
        {
            HMACSHA1 hmacsha1 = new HMACSHA1();
            byte[] byteData = Encoding.UTF8.GetBytes(text);
            hmacsha1.Key = Encoding.UTF8.GetBytes(key);
            byte[] dataBuffer = System.Text.Encoding.UTF8.GetBytes(text);
            byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);
            return Convert.ToBase64String(hashBytes);
        }

        /**
         * base64 编码
         */
        public static string EncodeBase64(string code_type, string code)
        {
            string encode = "";
            byte[] bytes = Encoding.GetEncoding(code_type).GetBytes(code);
            try
            {
                encode = Convert.ToBase64String(bytes);
            }
            catch
            {
                encode = code;
            }
            return encode;
        }


        public static void Main(string[] args)
        {
            MainClass ss = new MainClass();
            //添加公共参数
            Dictionary<String, String> publicParam = new Dictionary<string, string>();
            publicParam.Add("Format", ss.getFormat());
            publicParam.Add("Version", ss.getVersion());
            publicParam.Add("SignatureMethod", ss.getSignatureMethod());
            publicParam.Add("SignatureNonce", ss.getSignatureNonce());
            publicParam.Add("Timestamp", ss.getTimestamp());
            publicParam.Add("AccessKeyId", ss.getAccessKeyId());
            publicParam.Add("SignatureVersion", ss.getSignatureVersion());

            //添加API接口以及接口参数
            publicParam.Add("Action", "GetVideoPlayAuth");
            publicParam.Add("VideoId", "f6a21eade82f4cf6b45669fa34b35b76");


            //将参数名和参数值用“=”链接起来之后,按照整体字符串的字典序排序;
            Dictionary<String, String> sortedParams = publicParam.OrderBy(o => o.Key + "=" + o.Value).ToDictionary(o => o.Key, p => p.Value);
            //对连接之后的字符串进行urlencode
            Dictionary<String, String> urlEncoderParam = sortedParams.ToDictionary(k => MainClass.UrlEncode(k.Key), v => MainClass.UrlEncode(v.Value));
            //对urlencode之后的字符串进行特殊字符判断并转换
            Dictionary<String, String> parseEncoderParam = urlEncoderParam.ToDictionary(k => MainClass.checkParam(k.Key), v => MainClass.checkParam(v.Value));


            //对字符串进行拼接,获取strToSign
            string strToSign = "";
            foreach (KeyValuePair<String, String> k in parseEncoderParam)
            {
                strToSign += k.Key + "=" + k.Value + "&";
            }
            
            strToSign = "GET&%2F&" + MainClass.UrlEncode(strToSign.Substring(0, strToSign.Length - 1));
            string signature = HmacSha1Sign(strToSign, ss.getAccessKeySecret() + "&");

            if (signature.Contains("+"))
            {
                signature.Replace("+", "%2B");
            }
            publicParam.Add("Signature", signature);
            string url = "http://vod.cn-shanghai.aliyuncs.com?";
            foreach (KeyValuePair<string, string> pair in publicParam)
            {
                url += pair.Key + "=" + pair.Value + "&";
            }
            url = url.Substring(0, url.Length - 1);

            Console.WriteLine(url);
        }
    }
}
相关文章
|
3月前
|
弹性计算 网络安全
阿里云国际OpenAPI多接口快速管理ECS服务器教程
阿里云国际OpenAPI多接口快速管理ECS服务器教程
|
3月前
|
IDE API 开发工具
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
Alibaba Cloud API Toolkit for VSCode 是集成了 OpenAPI 开发者门户多项功能的 VSCode 插件,开发者可以通过这个插件方便地查找API文档、进行API调试、插入SDK代码,并配置基础环境设置。我们的目标是缩短开发者在门户和IDE之间的频繁切换,实现API信息和开发流程的无缝结合,让开发者的工作变得更加高效和紧密。
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
|
5月前
|
IDE API 开发工具
通过IDE插件体验阿里云OpenAPI的高效集成, 精品礼品等你来拿!
轻量级的开放API工具——Alibaba Cloud Developer Toolkit及Alibaba Cloud API Toolkit。这些插件支持快速查阅阿里云产品的开放API,提供API调试与SDK示例生成等功能,帮助开发者轻松集成阿里云服务。您可通过JetBrains Marketplace或VS Code Marketplace搜索安装,完成身份验证后即刻体验。欢迎分享您的使用反馈,有机会获得精美礼品!
|
6月前
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用合集之OpenAPI列表可以在什么地方查看
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
8月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
225 3
|
8月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
218 3
|
2月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
44 3
|
16天前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
65 12
|
2月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
74 4
|
4月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
56 2