请求方

try
            {
                using (var client = new HttpClient())
                {
                    StringContent content = new StringContent(strParam);//参数序列化后,放入StringContent
                    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");//设置type            //放入head的名字可以随意设置(和接收方一直就可以),值需要单独生成,最主要就是auth_param
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("auth名称", auth_param);
                    var response = client.PostAsync(FlightQueryUrl, content).Result;
                    if (response.IsSuccessStatusCode)
                    {
                        string responseText = response.Content.ReadAsStringAsync().Result;
                        if (string.IsNullOrEmpty(responseText))
                        {
                            return null;
                        }
                        return responseText ;
                    }
                    return null;
                }
            }
            catch (Exception ex)
            {
                return null;
            }
auth_param的计算方式,需要和接收方的一致:
//认证key
        private const string key = "认证key****#####$$$$$$@@@!!!!";

        //认证秘钥
        private const string secrect = "认证秘钥****#####$$$$$$@@@!!!!";

        /// <summary>
        /// 获取接口签名
        /// </summary>
        /// <param name="param">原始的请求参数</param>
        /// <param name="url">请求地址</param>
        /// <param name="requestId">请求Id,接入方自定义,最好用来区分每个请求</param>
        /// <returns></returns>
        public static string GetFlightSign(string param,string url,string requestId)
        {
            string timeStamp = GetTimeStamp();//获取时间戳
            url = System.Web.HttpUtility.UrlEncode(url.ToLower());

            /*
             * {认证key}{原始请求参数}{调用方自定义requestId}{时间戳}{原始URL}{认证秘钥}(被调用方也是如此)
             * 替换掉字符串中的换行与空格(被调用方也是如此)
             */
            string source = $"{key}{param}{requestId}{timeStamp}{url}{secrect}".Replace(Environment.NewLine, string.Empty).Replace("\n", "").Replace(" ", "");
            string hmac = GetMd5(source);

            //auth_param 身份验证参数字符串
            //{认证key}{}{调用方自定义requestId}{时间戳}  顺序需要更具被调用方设置
            return $"{key}:{hmac}:{requestId}:{timeStamp}";
        }

        /// <summary>
        /// 字符串编码
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static string GetMd5(string str)
        {
            if (string.IsNullOrEmpty(str))
                return str;
            var sb = new StringBuilder(32);
            var md5 = MD5.Create();
            var output = md5.ComputeHash(Encoding.UTF8.GetBytes(str));
            for (int i = 0; i < output.Length; i++)
                sb.Append(output[i].ToString("X").PadLeft(2, '0'));
            return sb.ToString();
        }
        /// <summary>
        /// 获取时间戳
        /// </summary>
        /// <returns></returns>
        private static string GetTimeStamp()
        {
            var initTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
            TimeSpan ts = DateTime.UtcNow - initTime;
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }

接收方

public class ReqAuthorizeAttribute:System.Web.Http.AuthorizeAttribute
{
        /// <summary>
        /// 进行验证
        /// </summary>
        /// <param name="actionContext"></param>
        public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            if (actionContext.Request.Headers.Authorization != null)
            {
                //获取请求的 认证信息
                string info = (actionContext.Request.Headers.Authorization.Parameter).Decrypt();          //todo:采用上面的方式,再次进行获取,然后比较                //也可以再次做调用次数统计等

                //判断认证信息是否正确
                if (string.Equals(info, secret))
                {
                    IsAuthorized(actionContext);
                }
                else
                {
                    HandleUnauthorizedRequest(actionContext);
                }
            }
            else
            {
                HandleUnauthorizedRequest(actionContext);
            }
        }

        /// <summary>
        /// 验证不通过 返回401
        /// </summary>
        /// <param name="actionContext"></param>
        protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            var challengeMsg = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
            challengeMsg.Headers.Add("WWW-Authenticate", "Basic");
            throw new System.Web.Http.HttpResponseException(challengeMsg);
        }

}

api接口签名认证的一种方式的更多相关文章

  1. kbmmw 做REST 服务签名认证的一种方式

    一般对外提供提供REST 服务,由于信息安全的问题, 都要采用签名认证,今天简单说一下在KBMMW 中如何 实现简单的签名服务? 整个签名服务,模仿阿里大鱼的认证方式,大家可以根据实际情况自己修改. ...

  2. Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证

    #settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...

  3. Android Studio签名打包的两种方式

    签名打包的两种方式: 注:给我们自己开发的app签名,就代表着我自己的版权,以后要进行升级,也必须要使用相同的签名才行.签名就代表着自己的身份(即keystore),多个app可以使用同一个签名. 如 ...

  4. 从后端接口下载文件的2种方式:get方式、post方式

    从后端接口下载文件的2种方式 一.get方式 直接使用: location.href='http://www.xxx.com/getFile?params1=xxx&params2=xxxx' ...

  5. RESTful接口签名认证实现机制

    RESTful接口 互联网发展至今,催生出了很多丰富多彩的应用,极大地调动了人们对这些应用的使用热情.但同时也为互联网应用带来了严峻的考验.具体体现在以下几个方面: 1.     部署方式的改变:当用 ...

  6. IdentityServer4实现.Net Core API接口权限认证(快速入门)

    什么是IdentityServer4 官方解释:IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现. 通俗 ...

  7. 在Spring-Boot中实现通用Auth认证的几种方式

    code[class*="language-"], pre[class*="language-"] { background-color: #fdfdfd; - ...

  8. 【RPC】远程接口调用实例 的几种方式比较

    pring中,用JMS搞RPC时会用到: org.springframework.jms.remoting.JmsInvokerServiceExporter org.springframework. ...

  9. API接口签名校验

    在开发app中,我们经常要为app提供接口.但是为了保证数据的安全,我们通常会对接口的参数进行加密. 1.不验证的接口api api接口请求,"http://www.xx.com/getUs ...

随机推荐

  1. document.domain实现不同域名跨域

    利用document.domain 实现跨域:前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域. 两个子域名:aaa.xxx ...

  2. 数据结构(一): 键值对 Map

    Map基本介绍 Map 也称为:映射表/关联数组,基本思想就是键值对的关联,可以用键来查找值. Java标准的类库包含了Map的几种基本的实现,包括:HashMap,TreeMap,LinkedHas ...

  3. Linux下安装配置与使用MySQL数据库

    Linux下安装配置与使用MySQL数据库 在Linux下安装做开发时往往少不了要使用到MySQL数据库,下面就Linux系统为例讲解一下,如何安装MySQL数据库,如何启用/停.止MySQL服务,如 ...

  4. [Node.js与数据库]node-mysql 模块介绍

    [Node.js与数据库]node-mysql 模块介绍   转载至:https://itbilu.com/nodejs/npm/NyPG8LhlW.html#multiple-statement-q ...

  5. C# DataGridView下DataGridViewComboBoxColumn二级联动

    效果: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Da ...

  6. 用C#学习数据结构之链表

    单链表的定义 链表是用一组任意的存储单元来存储线性表中的数据元素(这组存储单元可以是连续的,也可以是不连续的).那么,怎么表示两个数据元素逻辑上的相邻关系呢?即如何表示数据元素之间的线性关系呢?为此, ...

  7. java对文件的检索

    先说下思路吧. 1.先把xls等文件转换为静态html文件:可以用很多插件,类似我的博客地址: http://www.cnblogs.com/Alandre/p/3221006.html 2.再对转的 ...

  8. 从零开始学 Web 之 Vue.js(二)过滤器,按键修饰符,自定义指令

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  9. MYSQL中的COLLATE是什么?

    本文由horstxu发表 在mysql中执行show create table <tablename>指令,可以看到一张表的建表语句,example如下: CREATE TABLE `ta ...

  10. cmd命令窗口连接mysql的命令大全

    连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车) 创建授权:grant select on 数据库.* to 用户名@登 ...