HTTP基本认证
在HTTP中,HTTP基本认证(Basic Authentication)是一种允许浏览器或其他客户端程序使用(用户名,口令)请求资源的身份验证方式,不要求cookie,session identifier、login page等标记或载体。
所有浏览器据支持HTTP基本认证协议
基本身证原理不保证传输凭证的安全性,仅被based64编码,并没有encrypted或者hashed,一般部署在互信的内网,在公网上应用BA协议通常与https结合。
BA标准协议
BA协议的实施主要依靠约定的请求头/响应头, 典型的浏览器和服务器的BA认证流程:
① 浏览器请求应用了BA的网站,服务端响应一个401认证失败响应码,并写入WWW-Authenticate响应头,指示服务端支持BA协议。
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="our site"
或在初次请求时发送正确Authorization标头,从而避免被质询
② 客户端以based64(用户名:口令) 作为Authorization标头值,重新发送请求:
Authorization: Basic userid:password
认证的范围与realm相关,准确的realm由服务端定义,因为服务端可能有多个不同的realm.
> 浏览器客户端,对于WWW-Authenticate响应头弹出了口令输入窗。
BA编程实践
ASP.NET Core网站利用FileServerMiddleware将部分路径映射到文件资源,对该资源访问路径应用Http基本认证。
服务端实现BA认证
① 实现基本认证Handler:认证、无口令质询、质询失败逻辑
# ......
namespace EqidManager.Services
{public static class BasicAuthenticationScheme{public const string DefaultScheme = "Basic";}public class BasicAuthenticationOption:AuthenticationSchemeOptions{public string Realm { get; set; }public string UserName { get; set; }public string UserPwd { get; set; }}public class BasicAuthenticationHandler : AuthenticationHandler<BasicAuthenticationOption>{private readonly BasicAuthenticationOption authOptions;public BasicAuthenticationHandler(IOptionsMonitor<BasicAuthenticationOption> options,ILoggerFactory logger,UrlEncoder encoder,ISystemClock clock): base(options, logger, encoder, clock){authOptions = options.CurrentValue;}/// <summary>/// 认证逻辑/// </summary>protected override async Task<AuthenticateResult> HandleAuthenticateAsync(){if (!Request.Headers.ContainsKey("Authorization"))return AuthenticateResult.Fail("Missing Authorization Header");string username, password;try{var authHeader = AuthenticationHeaderValue.Parse(Request.Headers["Authorization"]);var credentialBytes = Convert.FromBase64String(authHeader.Parameter);var credentials = Encoding.UTF8.GetString(credentialBytes).Split(':');username = credentials[0];password = credentials[1];var isValidUser= IsAuthorized(username,password);if(isValidUser== false)return AuthenticateResult.Fail("Invalid username or password");}catchreturn AuthenticateResult.Fail("Invalid Authorization Header");var claims = new[] {new Claim(ClaimTypes.NameIdentifier,username),new Claim(ClaimTypes.Name,username),};var identity = new ClaimsIdentity(claims, Scheme.Name);var principal = new ClaimsPrincipal(identity);var ticket = new AuthenticationTicket(principal, Scheme.Name);return await Task.FromResult(AuthenticateResult.Success(ticket));}/// <summary>/// 质询/// </summary>protected override async Task HandleChallengeAsync(AuthenticationProperties properties){Response.Headers["WWW-Authenticate"] = $"Basic realm=\"{Options.Realm}\"";await base.HandleChallengeAsync(properties);}/// <summary>/// 认证失败/// </summary>protected override async Task HandleForbiddenAsync(AuthenticationProperties properties){await base.HandleForbiddenAsync(properties); }private bool IsAuthorized(string username, string password){return username.Equals(authOptions.UserName, StringComparison.InvariantCultureIgnoreCase)&& password.Equals(authOptions.UserPwd);}}
}
② 实现BasicAuthenticationMiddleware: 要求对HttpContext应用BA Scheme。
// HTTP基本认证Middlewarepublic static class BasicAuthentication{public static void UseBasicAuthentication(this IApplicationBuilder app){app.UseMiddleware<BasicAuthenticationMiddleware>();}}
public class BasicAuthenticationMiddleware
{private readonly RequestDelegate _next;private readonly ILogger _logger;public BasicAuthenticationMiddleware(RequestDelegate next, ILoggerFactory LoggerFactory){_next = next;_logger = LoggerFactory.CreateLogger<BasicAuthenticationMiddleware>();}public async Task Invoke(HttpContext httpContext, IAuthenticationService authenticationService){var authenticated = await authenticationService.AuthenticateAsync(httpContext, BasicAuthenticationScheme.DefaultScheme);_logger.LogInformation("Access Status:" + authenticated.Succeeded);if (!authenticated.Succeeded){await authenticationService.ChallengeAsync(httpContext, BasicAuthenticationScheme.DefaultScheme, new AuthenticationProperties { });return;}await _next(httpContext);}
}
③ ASP.NET Core 添加BA Scheme , 为待认证资源路径启用BA中间件,注意这里使用UseWhen插入中间件。
services.AddAuthentication(BasicAuthenticationScheme.DefaultScheme).AddScheme<BasicAuthenticationOption, BasicAuthenticationHandler>(BasicAuthenticationScheme.DefaultScheme,null);
app.UseWhen(predicate:x => x.Request.Path.StartsWithSegments(new PathString(_protectedResourceOption.Path)),configuration:appBuilder => { appBuilder.UseBasicAuthentication();});
现可在浏览器测试:
进一步思考?
以上是浏览器在BA协议中的行为:可尝试程序自动向服务端发起BA请求,需要的同学看博客园源码。
That's All . BA认证是常见的基础认证协议,文章期待以清晰的方式传递协议原理和编程实现,要的同学阅读原文。
往期精选
ASP.NET Core跨平台技术内幕
AspNetCore结合Redis实践消息队列
实例解读Docker Swarm
基于docker-compose的Gitlab CI/CD实践&排坑指南
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312459.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
计算机原理(计算机系统漫游)
使用ASP.NET Core 3.x 构建 RESTful API - 4.2 过滤和搜索
360浏览器linux版本_360安全浏览器崩溃解决方案
.NET 开源软件开发BIM工具包xBIM
2019(dotNet全栈开发)公众号回顾
CSS padding margin border属性讲解
【实战 Ids4】║ 客户端、服务端、授权中心全线打通!
补丁 检测系统_大云制造 | BCLinux For ARM64 V7.6操作系统正式发布
告别2019,写给2020:干好技术,要把握好时光里的每一步
单片机课程设计数字心率计_如何选购合适的PH计
cd返回上一 git_如何使用Git实现自动化部署你的项目
在Asp.Net Core中使用ModelConvention实现全局过滤器隔离
2 未匹配到任何借口_拼多多【关键词精确匹配溢价】给你想要的精准流量,让你订单暴增的秘诀...
如何运用领域驱动设计 - 领域服务
指令打印与驱动打印随笔
er图转为数据流程图_「数据架构」实体关系模型介绍
WeihanLi.Npoi 1.7.0 更新介绍
【复杂系统迁移 .NET Core平台系列】之迁移项目工程
分析股票大数据_Python大数据分析量学祖师爷网站数据
【复杂系统迁移 .NET Core平台系列】之界面层
- 使用概率表示和原型学习的有效半监督医学图像分割|文献速递-基于深度学习的病灶分割与数据超分辨率
- SNK施努卡 - 机器人测温取样系统
- StructuredStreamingKafka中的实时ETL案例及常见问题
- QtLua
- 【FreeRTOS学习】填充 0xa5 是为什么
- 【AI日记】24.11.14 复习和准备 RAG 项目 | JavaScript RAG Web Apps with LlamaIndex
- [译]9条关于高性能ElasticSearch的配置建议
- Cobub无码埋点关键技术的实现
- Educational Codeforces Round 37 (Rated for Div. 2)
- git分支进阶
- PHP_SELF变量解析和重复路径解决
- quartz基本使用