最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的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 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;
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
使用多线程思考 若程序中存在耗时操作,且耗时操作数据不与其他发生交互,如下载数据,那么直接进行线程操作即可。 如果耗时操作需要进行数据交互,而且耗时操作能分成并行的两部分或多部分,那么也可以进行多线程进行加速(不能分成两部分并行,可以尝试改变业务逻辑是否能拆成…