翼度科技»论坛 编程开发 .net 查看内容

基于Basic auth 的一个C# 示例

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的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#示例

步骤一
  1.         /// <summary>
  2.         /// 最终调用方法
  3.         /// </summary>
  4.         /// <param name="param">查询条件</param>
  5.         /// <param name="urlAddress">访问地址URL</param>
  6.         /// <param name="userName">用户名</param>
  7.         /// <param name="userPassword">密码</param>
  8.         /// <returns></returns>
  9.         public async Task<string> Basic_PostAsync(string param,string urlAddress,string userName,string userPassword)
  10.         {
  11.             string responseString = string.Empty;
  12.             try
  13.             {
  14.                 // 创建HttpWebRequest对象
  15.                 HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(urlAddress);
  16.                 _logger.Warn($"入参数据:{param}");
  17.                 //_logger.Warn($"矩阵系统地址:{_options.UrlAddress}");
  18.                 // 设置Post调⽤⽅法
  19.                 httpRequest.Method = "Post";
  20.                 //设置参数传输类型
  21.                 httpRequest.ContentType = " application/json; charset=utf-8";//"application/x-www-form-urlencoded;charset=utf-8";;;;application/json
  22.                 // 设置Http Basic认证的请求头
  23.                 string base64 = GetEncodedCredentials(userName, userPassword);
  24.                 httpRequest.Headers.Add("Authorization", "Basic " + base64);
  25.                 //传输参数格式转换
  26.                 byte[] bytesRequestData = Encoding.UTF8.GetBytes(param);
  27.                 //_logger.Warn($"入参数据格式转换:{bytesRequestData}");
  28.                 httpRequest.ContentLength = bytesRequestData.Length;
  29.                 Stream postStream = await httpRequest.GetRequestStreamAsync();
  30.                 postStream.Write(bytesRequestData, 0, bytesRequestData.Length);
  31.                 postStream.Close();
  32.                 //获取设置身份认证及请求超时时间
  33.                 SetWebRequest(httpRequest);
  34.                 // HttpWebRequest发起调⽤
  35.                 using (HttpWebResponse myResponse = (HttpWebResponse)httpRequest.GetResponse())
  36.                 {
  37.                     // StreamReader对象
  38.                     StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
  39.                     // 返回结果
  40.                     responseString = sr.ReadToEnd();
  41.                     _logger.Warn($"调用矩阵系统返回结果:{responseString}");
  42.                     return responseString;
  43.                 }
  44.             }
  45.             catch (Exception ex)
  46.             {
  47.                 //返回错误信息
  48.                 responseString = ex.ToString();
  49.             }
  50.             return responseString;
  51.         }
复制代码
步骤二
  1.         /// <summary>
  2.         /// 转换string
  3.         /// </summary>
  4.         /// <param name="userName"></param>
  5.         /// <param name="passwordName"></param>
  6.         /// <returns></returns>
  7.         private string GetEncodedCredentials(string userName, string passwordName)
  8.         {
  9.             string mergedCredentials = string.Format("{0}:{1}", userName, passwordName);
  10.             byte[] byteCredentials = UTF8Encoding.UTF8.GetBytes(mergedCredentials);
  11.             return Convert.ToBase64String(byteCredentials);
  12.         }
复制代码
步骤三
  1.         /// <summary>
  2.         /// 获取设置身份认证及请求超时时间
  3.         /// </summary>
  4.         /// <param name="request"></param>
  5.         private static void SetWebRequest(HttpWebRequest request)
  6.         {
  7.             request.Credentials = CredentialCache.DefaultCredentials;
  8.             request.Timeout = 1000000;
  9.         }
复制代码
来源:https://www.cnblogs.com/moonstars/p/17993139
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具