基于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#示例
步骤一
/// <summary>
/// 最终调用方法
/// </summary>
/// <param name="param">查询条件</param>
/// <param name="urlAddress">访问地址URL</param>
/// <param name="userName">用户名</param>
/// <param name="userPassword">密码</param>
/// <returns></returns>
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;
}
步骤二
/// <summary>
/// 转换string
/// </summary>
/// <param name="userName"></param>
/// <param name="passwordName"></param>
/// <returns></returns>
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);
}
步骤三
/// <summary>
/// 获取设置身份认证及请求超时时间
/// </summary>
/// <param name="request"></param>
private static void SetWebRequest(HttpWebRequest request)
{
request.Credentials = CredentialCache.DefaultCredentials;
request.Timeout = 1000000;
}
基于Basic auth 的一个C# 示例的更多相关文章
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- Basic Auth攻击
1.Basic Auth认证简介 Basic身份认证,是HTTP 1.0中引入的认证方案之一.虽然方案比较古老,同时存在安全缺陷,但由于实现简单,至今仍有不少网站在使用它. 例如Apche Tomca ...
- 基于 Traefik 的 Basic Auth 配置
前言 Traefik是一个现代的HTTP反向代理和负载均衡器,使部署微服务变得容易. Traefik可以与现有的多种基础设施组件(Docker.Swarm模式.Kubernetes.Marathon. ...
- eShopOnContainers 是一个基于微服务的.NET Core示例框架
找到一个好的示例框架很难,但不是不可能.大多数是小型Todo风格的应用程序,通常基于SimpleCRUD.值得庆幸的是,Microsoft已经为eShopOnContainers创建了一个基于微服务的 ...
- 使用crypt配置Basic Auth登录认证
简介 Basic Auth用于服务端简单的登录认证,通常使用服务器Nginx.Apache本身即可完成.比如我们要限定某个域名或者页面必须输入用户名.密码才能登录,但又不想使用后端开发语言,此时Bas ...
- Etcd安全配置之Basic Auth认证
<中小团队落地配置中心详解>文章中我们介绍了如何基于Etcd+Confd构建配置中心,最后提到Etcd的安全问题时说了可以使用账号密码认证以达到安全访问的目的,究竟该如何开启认证以及怎么设 ...
- SpringBoot + CXF快速实现SOAP WebService(支持Basic Auth)
唠叨两句 讲真,SOAP跟现在流行的RESTful WebService比起来显得很难用.冗余的XML文本信息太多,可读性差,它的请求信息有时很难手动构造,不太好调试.不过说归说,对某些企业用户来说S ...
- 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)
搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...
- WCF学习之旅——第一个WCF示例(一)
最近需要用到WCF,所以对WCF进行了解.在实践中学习新知识是最快的,接下来先做了一个简单的WCF服用应用示例. 本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些 ...
- WCF学习之旅——第一个WCF示例(三)
第五步:创建客户端 WCF应用服务被成功寄宿后,WCF服务应用便开始了服务调用请求的监听工作.此外,服务寄宿将服务描述通过元数据的形式发布出来,相应的客户端就可以获取这些元数据.接下来我们来创建客户端 ...
随机推荐
- 挖掘优质短视频超百万条,火山引擎DataLeap助力电商平台生态治理
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在人们的日常生活中,网购已经成为人们生活中不可或缺的购物形式. 根据<中国社交电商行业发展白皮书( ...
- 火山引擎DataLeap的Data Catalog系统公有云实践 (下)
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 Data Catalog公有云遇到的挑战 Data Catalog经历了一个从0到1在火山引擎公有云部署并逐步优化 ...
- 火山引擎云原生数据仓库 ByteHouse 技术白皮书 V1.0 (Ⅵ)
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,<火山引擎云原生数据仓库 ByteHouse 技术白皮书>正式发布.白皮书简述了 ByteHou ...
- Jenkins Pipeline 流水线 - 完整构建 Pipeline Script 脚本
Docker Jenkins 安装配置 Windows 2016 安装 Jenkins 前置条件可参考 Jenkins Pipeline 流水线 - 拉代码(SVN) + Maven 编译打包 Jen ...
- MB52增强
一.在MB52报表中新增字段 实现如图效果 二.增强实现 MB52程序为RM07MLBS,在程序中找到定义的内表结构bestand,在最后创建隐式增强,加入增强字段,该内表为将来展示的ALV数据 设置 ...
- Woodpecker CI 设计分析|一个 Go 编写的开源持续集成引擎
一.前言 大家好,这里是白泽.随着 Go 语言在云原生领域大放异彩,开发者逐渐将目光转移到了这门语言上,而容器则是云原生时代最核心的载体. <Woodpecker CI 设计分析>系列文章 ...
- 【TCP】学习笔记:application/octet-stream
当浏览器在请求资源时,会通过http返回头中的content-type决定如何显示/处理将要加载的数据,如果这个类型浏览器能够支持阅览,浏览器就会直接展示该资源,比如png.jpeg.video等格式 ...
- slot-具名插槽
定义组件:NamedSlot组件 <div class=""> <header> <slot name="header">& ...
- 【日常踩坑】Debug 从入门到入土
写代码难免遇到 bug,调试解决 bug 的快慢很影响开发的效率.本文主要是梳理并记录下个人经常用的调试方法(主要以 C/C++ 的 segment fault 为例) 分类 根据调试时机与 bug ...
- C语言中的操作符:了解与实践
欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. 操作符的分类 操作符又叫运算符,它在C语言中起着非常大的作用,以下是 ...