• 基于Basic auth 的一个C# 示例


    最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,谁让客户的系统就是这样的呢。因为现在开发中绝大多数使用的是基于Bearer 认证的。

    1、研究

    1.Basic auth是在HTTP 1.0提出的,是一种较为简单的HTTP认证方式,客户端通过明文 (Base64编码格式)传输用户名和密码到服务端进行认证,通常需要配合HTTPS来保证信息传输的安全。

    3.若是未认证,服务器则会像客户端返回401 UNAUTHORIZED;如果客户端是浏览器,收到401后会弹出对话框要求输入用户名及密码
    4.输入的用户名和密码会按照username:password的格式拼接后用base64编码,填入请求报文头部的Authorization域,如Basic bWFyczpsb28=。如果输入的是错误的用户名和密码,服务器会反复提示输入用户名和密码,直至输入正确或用户点击取消按钮放弃认证。如果输入的是正确的用户名及密码,浏览器返回认证通过后的页面。
    5. 由于base64编码本身是可逆的过程,所以如果有中间人截获报文后,通过重放攻击即可获取正确授权。

    2、一个C#示例

    步骤一
            /// 
            /// 最终调用方法
            /// 
            /// 查询条件
            /// 访问地址URL
            /// 用户名
            /// 密码
            /// 
            public async Task<string> Basic_PostAsync(string param,string urlAddress,string userName,string userPassword)
            {
                string responseString = string.Empty;
                try
                {
                    // 创建HttpWebRequest对象
                    HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(urlAddress);
                    _logger.Warn($"入参数据:{param}");
                    //_logger.Warn($"矩阵系统地址:{_options.UrlAddress}");
                    // 设置Post调⽤⽅法
                    httpRequest.Method = "Post";
                    //设置参数传输类型
                    httpRequest.ContentType = " application/json; charset=utf-8";//"application/x-www-form-urlencoded;charset=utf-8";;;;application/json
                    // 设置Http Basic认证的请求头
                    string base64 = GetEncodedCredentials(userName, userPassword);
                    httpRequest.Headers.Add("Authorization", "Basic " + base64);
                    //传输参数格式转换
                    byte[] bytesRequestData = Encoding.UTF8.GetBytes(param);
                    //_logger.Warn($"入参数据格式转换:{bytesRequestData}");
                    httpRequest.ContentLength = bytesRequestData.Length;
                    Stream postStream = await httpRequest.GetRequestStreamAsync();
                    postStream.Write(bytesRequestData, 0, bytesRequestData.Length);
    
                    postStream.Close();
                    //获取设置身份认证及请求超时时间
                    SetWebRequest(httpRequest);
                    // HttpWebRequest发起调⽤
                    using (HttpWebResponse myResponse = (HttpWebResponse)httpRequest.GetResponse())
                    {
                        // StreamReader对象
                        StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
                        // 返回结果
                        responseString = sr.ReadToEnd();
    
                        _logger.Warn($"调用矩阵系统返回结果:{responseString}");
                        return responseString;
                    }
                }
                catch (Exception ex)
                {
                    //返回错误信息
                    responseString = ex.ToString();
                }
                return responseString;
            }
    
    步骤二
            /// 
            /// 转换string
            /// 
            /// 
            /// 
            /// 
            private string GetEncodedCredentials(string userName, string passwordName)
            {
                string mergedCredentials = string.Format("{0}:{1}", userName, passwordName);
                byte[] byteCredentials = UTF8Encoding.UTF8.GetBytes(mergedCredentials);
                return Convert.ToBase64String(byteCredentials);
            }
    
    步骤三
            /// 
            /// 获取设置身份认证及请求超时时间
            /// 
            /// 
            private static void SetWebRequest(HttpWebRequest request)
            {
                request.Credentials = CredentialCache.DefaultCredentials;
                request.Timeout = 1000000;
    
            }
    
  • 相关阅读:
    [swift刷题模板] 树状数组(BIT/FenwickTree)
    Java设计模式之备忘录模式
    域策略(7)——禁用本地administrator登录计算机
    【系统架构设计师】第二章 操作系统
    SQL interview Questions
    Vue入门
    软件开发项目文档系列之十三如何撰写用户操作手册
    【无标题】
    Java的ArrayList应用(查增改删)
    【学习笔记03】node.js搭建一个简易的服务器
  • 原文地址:https://www.cnblogs.com/moonstars/p/17993139