ASP.NETCore编程实现基本认证

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,一经查实,立即删除!

相关文章

计算机原理(计算机系统漫游)

计算机五大组成部件&#xff1a;运算器&#xff08;ALU&#xff09;&#xff0c;控制器&#xff0c;存储器&#xff0c;输入部件&#xff0c;输出部件 1.控制器 2.运算器 逻辑运算&#xff08;判断事物的对与错&#xff09; 数学运算(11) 控制器运算器中央处理器&#xff08;CP…

使用ASP.NET Core 3.x 构建 RESTful API - 4.2 过滤和搜索

向Web API传递参数数据可以通过多种方式来传给API。 Binding Source Attributes 会告诉 Model 的绑定引擎从哪里找到绑定源。 共有以下六种 Binding Source Attributes&#xff1a; [FromBody] 请求的 Body [FromForm] 请求的 Body 中的 form数据 [FromHeader] 请求的 Header […

360浏览器linux版本_360安全浏览器崩溃解决方案

360安全浏览器崩溃解决方案方案一&#xff1a;打开360安全浏览器&#xff0c;按键盘上的F1调出浏览器医生界面&#xff0c;点击一键修复即可。如图所示&#xff1a;方案二&#xff1a;360浏览器打开了太多标签占用内存&#xff0c;并且随着浏览器开着的时间越长&#xff0c;占用…

.NET 开源软件开发BIM工具包xBIM

一、xBIM 简介BIM&#xff08;Building Information Modelling&#xff09;建筑信息模型&#xff0c;xBIM&#xff08;eXtensible Building Information Modelling&#xff09;可扩展的建筑信息模型。它是一个.NET 开源软件开发BIM工具包&#xff0c;支持BuildingSmart数据模型…

2019(dotNet全栈开发)公众号回顾

2019年已经过去&#xff0c;人口红利已经逐渐消失&#xff0c;也许这是这10年互联网史上最糟糕的一年&#xff0c;也可能这是未来10年互联网史上最好的一年关于公众号&#xff0c;我其实很早就开始注册了&#xff0c;只是一直没怎么运营&#xff08;ps&#xff1a;不知道怎么推…

CSS padding margin border属性讲解

把所有网页上的对象都放在一个盒&#xff08;box&#xff09;中 &#xff0c;设计师可以通过创建定义来控制这个盒的属性&#xff0c;这些对象包括段落、列表、标题、图片以及层。 盒模型主要定义四个区域&#xff1a; 内容&#xff08;content&#xff09; 内边距&#xff08;…

【实战 Ids4】║ 客户端、服务端、授权中心全线打通!

1、经过元旦两天的全力整改&#xff0c;终于在这新的一年&#xff0c;完成了我的布道生涯的第一个大步走 —— 那就是客户端&#xff08;VUE&#xff09;、服务端&#xff08;ASP.NET Core API&#xff09;、授权中心&#xff08;IdentityServer4&#xff09;的大融合&#xff…

补丁 检测系统_大云制造 | BCLinux For ARM64 V7.6操作系统正式发布

友情提示&#xff1a;全文3000多文字&#xff0c;预计阅读时间10分钟概述大云企业操作系统(BC-Linux&#xff0c;BigCloud Enterprise Linux)是中移(苏州)软件技术有限公司借助开源社区优势&#xff0c;通过定制化手段研发的高性能、安全可靠、自主可控的企业级Linux操作系统。…

告别2019,写给2020:干好技术,要把握好时光里的每一步

本文来自&#xff1a;长沙.NET技术社区 邹溪源不知不觉&#xff0c;一晃年关将近&#xff0c;即将翻开2019&#xff0c;进入新的一页。&#xff08;本文写于2019年12月27日&#xff09;这周已经在朋友圈看到了来自公众号《恰同学少年》《Edi.Wang》和《吃草的罗汉》几位老师写下…

单片机课程设计数字心率计_如何选购合适的PH计

聚舟供应的PH计PH计已经被广泛应用于各个行业&#xff0c;如工业、电力、农业、医药、食品、科研和环保等领域&#xff0c;在酸碱值检测时必不可少的&#xff0c;那么该如何选购呢&#xff1f;聚舟销售的PH计也有多种样式与型号&#xff0c;各种型号都供应充足&#xff0c;欢迎…

cd返回上一 git_如何使用Git实现自动化部署你的项目

在开发过程中&#xff0c;我们不可避免的会用到版本控制。你可能对 Git 和 SVN 有所了解。一开始基本都是在用SVN&#xff0c;现在可能都进化到用Git了吧&#xff0c;因为SVN缺点比较多。这里就不过于多的介绍Git的优点了。不知道大家一开始是怎么使用 git 进行开发的&#xff…

在Asp.Net Core中使用ModelConvention实现全局过滤器隔离

从何说起这来自于我把项目迁移到Asp.Net Core的过程中碰到一个问题。在一个web程序中同时包含了MVC和WebAPI&#xff0c;现在需要给WebAPI部分单独添加一个接口验证过滤器IActionFilter&#xff0c;常规做法一般是写好过滤器后给需要的控制器挂上这个标签&#xff0c;高级点的做…

2 未匹配到任何借口_拼多多【关键词精确匹配溢价】给你想要的精准流量,让你订单暴增的秘诀...

关键词匹配方式升级啦&#xff0c;开启精确匹配溢价功能&#xff0c;拥有更多精准流量。为帮助商家解决在使用多多搜索时&#xff0c;遇到的关键词流量不精准、流量不可控、点击率低的问题&#xff0c;多多搜索新推出【关键词精确匹配溢价】功能。通过精确匹配溢价功能&#xf…

如何运用领域驱动设计 - 领域服务

概述本文将介绍领域驱动设计&#xff08;DDD&#xff09;战术模式中另一个非常重要的概念 - 领域服务。在前面两篇博文中&#xff0c;我们已经学习到了什么是值对象和实体&#xff0c;并且能够比较清晰的定位它们自身的行为。但是在某些时候&#xff0c;你会发现某一些业务行为…

指令打印与驱动打印随笔

本文对指令打印和驱动打印做了一个简要的介绍&#xff0c;分享了在开发客户端打印组件时的一些过程并提出了一个新轮子用于解决老的问题并引出更多的新问题。全文大概 3500 字无图&#xff0c;阅读大概需要 7 分钟。驱动打印是指&#xff1a;使用 PrintDocument 进行打印。通过…

er图转为数据流程图_「数据架构」实体关系模型介绍

实体-关系模型(或ER模型)描述特定知识领域中相关的事物。基本的ER模型由实体类型(对感兴趣的事物进行分类)和指定实体之间可能存在的关系(那些实体类型的实例)组成。在软件工程中&#xff0c;为了执行业务流程&#xff0c;ER模型通常用于表示业务需要记住的内容。因此&#xff…

WeihanLi.Npoi 1.7.0 更新介绍

WeihanLi.Npoi 1.7.0 更新介绍Intro昨天晚上发布了 WeihanLi.Npoi 1.7.0 版本&#xff0c;增加了 ColumnInputFormatter/ ColumnOutputFormatter&#xff0c;又进一步增强了导入导出的灵活性&#xff0c;来看下面的示例ColumnInputFormatter/ColumnOutputFormatter示例 Model:i…

【复杂系统迁移 .NET Core平台系列】之迁移项目工程

源宝导读&#xff1a;微软跨平台技术框架—.NET Core已经日趋成熟&#xff0c;已经具备了支撑大型系统稳定运行的条件。本文将介绍明源云ERP平台从.NET Framework向.NET Core迁移过程中的实践经验。一、背景随着ERP的产品线越来越多&#xff0c;业务关联也日益复杂&#xff0c;…

分析股票大数据_Python大数据分析量学祖师爷网站数据

本文通过Python抓取股海明灯涨停预报数据进行分析&#xff0c;股海明灯网站涨停预报数据跟踪功能是需要VIP权限&#xff0c;但这个权限分析数据的功能有限&#xff0c;我们抓取数据后丰富相关功能。一、点击涨停预报后打开以下页面。通过python程序将数据抓取到后台数据库&…

【复杂系统迁移 .NET Core平台系列】之界面层

源宝导读&#xff1a;微软跨平台技术框架—.NET Core已经日趋成熟&#xff0c;已经具备了支撑大型系统稳定运行的条件。本文将介绍明源云ERP平台从.NET Framework向.NET Core迁移过程中的实践经验。一、背景随着ERP的产品线越来越多&#xff0c;业务关联也日益复杂&#xff0c;…