阿里云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);
        }
    }
}
相关文章
|
1月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
102 2
|
1月前
|
弹性计算 网络安全
阿里云国际OpenAPI多接口快速管理ECS服务器教程
阿里云国际OpenAPI多接口快速管理ECS服务器教程
|
3月前
|
C# 开发者 Windows
在VB.NET项目中使用C#编写的代码
在VB.NET项目中使用C#编写的代码
57 0
|
1月前
|
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
|
1月前
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
78 2
|
1月前
|
中间件 数据库连接 API
C#数据分表核心代码
C#数据分表核心代码
38 0
|
3月前
|
物联网 C# Windows
看看如何使用 C# 代码让 MQTT 进行完美通信
看看如何使用 C# 代码让 MQTT 进行完美通信
599 0
|
3月前
|
数据安全/隐私保护 C# UED
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
52 0
|
3月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
105 0
|
3月前
|
前端开发 程序员 API
从后端到前端的无缝切换:一名C#程序员如何借助Blazor技术实现全栈开发的梦想——深入解析Blazor框架下的Web应用构建之旅,附带实战代码示例与项目配置技巧揭露
【8月更文挑战第31天】本文通过详细步骤和代码示例,介绍了如何利用 Blazor 构建全栈 Web 应用。从创建新的 Blazor WebAssembly 项目开始,逐步演示了前后端分离的服务架构设计,包括 REST API 的设置及 Blazor 组件的数据展示。通过整合前后端逻辑,C# 开发者能够在统一环境中实现高效且一致的全栈开发。Blazor 的引入不仅简化了 Web 应用开发流程,还为习惯于后端开发的程序员提供了进入前端世界的桥梁。
373 0