1.AspNetCore打造一个“最安全”的保护api接口
2.一些小众冷门但却非常实用的.NET(Core)开源库推荐
3..netcore有哪些不错的开源项目?
4.Asp.NetCore1.1版本去掉project.json后如何打包生成跨平台包
5.asp.netmvc和asp.netcore的区别?
6.ASP.NET Core认è¯åçåå®ç°
AspNetCore打造一个“最安全”的api接口
在构建安全的API接口时,选择正确的源码认证与授权策略是至关重要的。本文将引导你如何使用非对称加密(如RSA)结合ASP.NET Core框架,码保设计一个既安全又易于理解的保护API接口,确保数据在传输过程中不被篡改或窃取。源码本指南将分步骤详细介绍如何实现这一目标。码保cilium 源码解析
首先,保护考虑性能影响,源码选择非对称加密方案,码保例如RSA 位公私钥对。保护这种加密方式在HTTP传输中分为请求与响应两个模式,源码确保数据在双向交互过程中安全性。码保非对称加密利用公钥和私钥对数据进行加密与解密,保护公钥用于加密数据,源码私钥用于解密数据,码保从而保证了数据的安全性与完整性。
在实现这一加密过程时,公钥与私钥各有其作用。公钥用于验证消息来源,私钥用于生成独特的签名,以证明消息未被篡改。当系统A向系统B发送信息时,使用私钥对消息进行签名,系统B接收信息后使用公钥验证签名,确认信息来源及未被篡改。
为了实现这一过程,首先创建一个ASP.NET Core Web API项目。在此基础上,设计并实现自定义认证授权体系,确保数据的传输安全。具体步骤包括创建配置选项、Scheme选项类、常量定义、认证处理器(AuthSecurityRsaAuthenticationHandler)、扩展方法、中间件(SafeResponseMiddleware)等。这些组件共同作用,形成一个完整的深夜商城云购源码认证授权框架,确保API接口的访问符合预期的安全标准。
在实现过程中,需要关注API接口的请求体解析与校验,通过IModelBinder实现模型绑定,确保数据的正确性。同时,采用特性解析(Attribute)对模型进行额外验证,确保数据输入符合业务逻辑。在Startup配置中整合这些组件,完成服务端API接口的构建。
为客户端提供接口调用能力,实现RSA秘钥生成。通过下载并使用OpenSSL工具生成公钥与私钥,确保客户端能够与服务端进行安全交互。将生成的秘钥与API接口结合,实现双向加密与签名认证,进一步增强数据传输的安全性。
在模型解析与校验的基础上,实现对响应结果的安全处理,确保数据在返回客户端时同样安全。通过编写客户端接口,与服务端进行交互测试,验证API接口的安全与稳定性。
本指南提供的方法,不仅适用于构建安全的API接口,还适用于接入ASP.NET Core认证系统与权限管理,优化API接口的用户体验。虽然RSA加密在确保数据安全方面表现出色,但其性能可能会因数据大小增加而受到影响。实际应用中,可以根据需求选择对称加密(如AES或DES)进行数据加密,以提高性能。
本文的目的是分享如何在使用ASP.NET Core框架时,设计与实现安全、高效的API接口,同时提供关于如何接入认证体系与模型校验的实践指导。希望本文能够帮助开发者构建出既安全又易于理解的琉璃神社的资源码API接口,为应用提供坚实的后端支持。
一些小众冷门但却非常实用的.NET(Core)开源库推荐
今天,我要向大家介绍一些我个人在.NET(Core)开发中使用的、虽然不太热门但极其实用的开源库。这些库虽然点赞数不高,但它们在实际项目中的价值不可小觑。本文聚焦于那些小众且鲜为人知的工具库,避免了大家耳熟能详的如AutoMapper、Autofac等。
首先,是我的开源作品Masuit.Tools,它集合了丰富的功能,涵盖了数据库操作、日期时间处理、文件操作、硬件监控、HTML操作、日志管理、多媒体文件操作、网络通信、Nosql操作、反射、加密安全、字符串扩展、WinAPI以及全局扩展等。它的存在使得我的代码更加简洁高效,几乎不可或缺。目前,该库在GitHub上的star数超过个,证明了它的实用性和价值。
其次,Masuit.LuceneEFCore.SearchEngine是一个本地搜索引擎,基于EntityFrameworkCore和Lucene.NET,提供高性能全文检索,适用于基于EntityFrameworkCore的数据库应用。它支持权重查询,响应快速。影视app源码对接苹果
CacheManager是强大的缓存中间件,简化了开发者的工作,支持多种缓存提供者和高级功能。它不仅提供统一的编程模型,还支持多层缓存和高级功能如缓存同步。
htmldiff.net-core用于比较HTML文件,提供直观的差异显示,方便调试。IP2Region和MaxMind.GeoIP2则用于IP地址的地理信息查询,具有极高的准确性和查询速度。
Karambolo.AspNetCore.Bundling.NUglify解决了.NET Core MVC中静态资源压缩的痛点,提供了与.NET Framework相似的使用体验,有助于前端性能优化。
OpenXmlPowerTools扩展了Open XML SDK,支持DOCX、XLSX和PPTX文件的编程操作,如数据填充、转换和搜索替换等。
其他的库如Svg用于SVG图形操作,TimeZoneConverter处理时区转换,RssSyndication支持RSS订阅接口,Z.EntityFramework.Plus.EFCore优化了EFCore性能,SharpCompress提供文件压缩功能,DnsClient高效DNS查询,HtmlAgilityPack解析HTML,HtmlSanitizer防止XSS攻击,ObjectsComparer用于对象比较,SearchExtensions提供简单全文检索,都各有其独特的实用价值。
以上就是我精心挑选的开源库,虽然小众,但它们在提升开发效率和项目质量上发挥了重要作用。如果你也发现有类似的宝藏库,欢迎分享,让我们一起提高编程效率,减少加班时间。
.netcore有哪些不错的如何利用git恢复源码开源项目?
以下为推荐的几个.NET Core开源项目: 1. Masuit.Tools这是一个包含了加密解密、反射操作、硬件信息、日期时间扩展等常用封装的开源项目。其开源协议规定,一旦因违反劳动法的公司使用该项目,项目作者有权追讨使用费或不允许使用包含该项目的源代码。项目特色功能包括Socket客户端操作类、模板引擎、任意进制转换、DateTime扩展及反射操作。
2. OrchardCore
OrchardCore 是使用 ASP.NET Core 构建的开源模块化、多租户应用程序框架,同时也是内容管理系统(CMS)的基础。它有两个项目,其中一个是 Fur,适用于.NET 5 平台的入门级、快速开发的 Web 应用框架。强调“六极”设计思想,易于入门、极速开发、极少依赖、极少配置、极其灵活、易于维护。此外,它结合了敏捷开发模式,用户能在冲一杯咖啡的时间内完成工作。Fur框架的特色功能包括支持.NET 5的新功能、六级架构设计和敏捷开发模式等。3. awesome-dotnet-core
这个集合包含了.NET Core开源项目的库、工具、框架、模板引擎、身份认证、数据库、ORM框架、处理、文本处理、机器学习、日志、代码分析、教程等资源。4. ZKEACMS
ZKEACMS 是一个基于ASP .Net Core开发的免费内容管理系统,提供了可视化编辑设计,支持直接在预览页面设计网页,以拼图方式构建网站。它采用跨平台设计,适用于Windows、MAC OS、Linux、Docker等环境。5. YiShaAdmin
YiShaAdmin 是一个基于.NET Core Web开发的快速开发平台,提供了代码生成器,能够减少%以上的编码工作量,提高开发效率,节省项目研发成本和开发周期。它使用了Bootstrap、ASP.NET Core、Entity Framework Core等技术。6. .NET Core源码
这是C#开源项目中的推荐,包含.NET Core源代码。7. Util应用框架
Util是一个.NET Core平台下的应用框架,旨在提升小型团队的开发输出能力。它由常用公共操作类、分层架构基类、UI组件、第三方组件封装、第三方业务接口封装、代码生成模板、权限等功能组成。8. OSharp
OSharp 是一个基于.NETStandard2.x的快速开发框架,使用了最新的.NETCore SDK,对 AspNetCore 进行了更高级的封装,并提供了一套规范的业务实现代码结构与操作流程,易于实际项目开发。9. XBlog
这是个人博客系统,提供了技术要点和功能。. FreeSql
FreeSql 是一个强大的对象关系映射技术(O/RM),支持.NETCore 2.1+或.NETFramework 4.0+或Xamarin等平台。. Autofac
经典的依赖注入(DI)框架,适用于Microsoft .NET,管理类之间的依赖关系,使应用程序在大小和复杂性增长时易于更改。. OpenAuth.Core
一个快速应用开发框架和权限管理工作流系统,基于经典领域驱动设计,提供组织机构、角色用户、权限授权、表单设计、工作流等功能。. Abp.VNext.Hello
这是ABP框架的示例项目,具备分层和模块化结构,包含授权、验证、异常处理、日志、数据库连接管理、设置管理、审计日志等特性。以上项目涵盖了从基础工具到高级框架的多个类别,适合不同开发者需求。
Asp.NetCore1.1版本去掉project.json后如何打包生成跨平台包
本章将要和大家分享的是Asp.NetCore1.1版本去掉了project.json后如何打包生成跨平台包, 为了更好跟进AspNetCore的发展,把之前用来做netcore开发的vs卸载后并安装了vs,这给我带来的直接好处是把我报红的C盘腾出GB左右的空间,从这里直接能感受到vs体积如此之小;之前有写过一篇开源netcore服务的文章开源一个跨平台运行的服务插件 - TaskCore.MainForm,里面有讲述netcore项目生成和部署在win7和ubuntu.系统上的例子,感兴趣的朋友可以去看看;下面开始本文的内容,希望大家能够喜欢,也希望各位多多"扫码支持"和"推荐"谢谢!
AspNetCore中使用Session(基于MemoryCache组件)
这节内容看起来有点不符合文章标题,主要是只写生成跨平台包的内容太少,有些朋友觉得干活太少不满意,因此就用这如果使用Session来填充吧哈哈(我的理念是:一天一进步,哪怕一丁点);对于一个web程序来说session存储通常有很多种方式,例如我前面文章有使用Redis来存储session的相关文章,那对于一个netcore项目来说默认session存储的方式是memorycache的方式,可以这样在项目中的 Startup.cs 文件中 ConfigureServices 方法增加如下代码片段:
services.AddDistributedMemoryCache();
services.AddSession(b =>
{
b.IdleTimeout = TimeSpan.FromMinutes(1);5 b.CookieName = "MySid";
});
并在 Configure 方法中添加 app.UseSession(); session的使用;当把上面的代码片段复制到你程序中时,会提示一个小灯泡,需要你点击选择引用下对应的包,对于vs自动装了netcore的开发环境,所以只需要点击灯泡引用就行了,如果你没有装开发sdk,那么需要下载nuget包: Microsoft.AspNetCore.Session ;第一段 services.AddDistributedMemoryCache() 主要作用是添加memorycache存储引用,第二段AddSession方法才是真正添加session相关的东西,这里我用到的两个个属性:
1. IdleTimeout:设置session过期时间;
2. CookieName:设置sessionId存储在客户端浏览器中的key名称;
当完成上面步骤的操作后,可以在任意Controller(这里是HomeController)的Action中使用 HttpContext.Session.Set 方法添加session:
public IActionResult About()
{
_logger.LogInformation("这里是About");
var userInfo = "我的NetCore之Session";
HttpContext.Session.Set(SessionKey, System.Text.Encoding.UTF8.GetBytes(userInfo));
ViewData["Message"] = $"读取配置文件Option1节点值:{ this._options.Option1},添加session";
return View();
}
再通过另外Contact的Action中使用 HttpContext.Session.TryGetValue(SessionKey, out var bt) 来获取我们刚设置的session:
public IActionResult Contact()
{
var userInfo = string.Empty;
if (HttpContext.Session.TryGetValue(SessionKey, out var bt))
{
userInfo = System.Text.Encoding.UTF8.GetString(bt);
}
ViewData["Message"] = string.IsNullOrWhiteSpace(userInfo) ? "Session获取为空" : userInfo;
return View();
}
好了就这么简单,咋们运行看下效果:dontnet run 命令来运行测试站点,不出意外会在界面得到如下截图:
通过浏览器控制台能够看到咋们的sessionId的名称是MySid,这个正如我们在 Startup.cs 设置的CookieName一样呢;
ISession扩展方法
上面用到的Set方法来保存sesseion,咋们来看看她的参数 void Set(string key, byte[] value); 键值对的方式,但是值是一个byte[]类型的参数,我们每次使用的时候都需要自己转一下数据类型感觉不是很方便,那么我们通过扩展方法的方式来扩展下 ISession ,如下扩展代码:
public static class PublicExtensions
{
#region ISession扩展
/// <summary>
/// 设置session
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="session"></param>
/// <param name="key"></param>
/// <param name="val"></param>
/// <returns></returns>
public static bool Set<T>(this ISession session, string key, T val)
{
if (string.IsNullOrWhiteSpace(key) || val == null) { return false; }
var strVal = JsonConvert.SerializeObject(val);
var bb = Encoding.UTF8.GetBytes(strVal);
session.Set(key, bb);
return true;
}
/// <summary>
/// 获取session
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="session"></param>
/// <param name="key"></param>
/// <returns></returns>
public static T Get<T>(this ISession session, string key)
{
var t = default(T);
if (string.IsNullOrWhiteSpace(key)) { return t; }
if (session.TryGetValue(key, out byte[] val))
{
var strVal = Encoding.UTF8.GetString(val);
t = JsonConvert.DeserializeObject<T>(strVal);
}
return t;
}
#endregion
}
直接传递一个对象T到扩展方法中,转类型后再存储的session中去,为了更好的测试我们直接在上面测试用例上修改代码如:
public IActionResult About()
{
_logger.LogInformation("这里是About");
//var userInfo = "我的NetCore之Session";
//HttpContext.Session.Set(SessionKey, System.Text.Encoding.UTF8.GetBytes(userInfo));
MoUser user = new MoUser();
HttpContext.Session.Set<MoUser>(SessionKey, user);
ViewData["Message"] = $"读取配置文件Option1节点值:{ this._options.Option1},添加session";
return View();
}
public IActionResult Contact()
{
//var userInfo = string.Empty;
//if (HttpContext.Session.TryGetValue(SessionKey, out var bt))
//{
// userInfo = System.Text.Encoding.UTF8.GetString(bt);
//}
//ViewData["Message"] = string.IsNullOrWhiteSpace(userInfo) ? "Session获取为空" : userInfo;
var user = HttpContext.Session.Get<MoUser>(SessionKey);
ViewData["Message"] = user == null ? "Session获取为空" : $"昵称:{ user.UserName}";
return View();
}
看起来set或get的session操作都只需一句代码就完成了是不是方便了许多呢,最有命令:dotnet run 测试下效果,和上面的一样我就不截图了;
1.1版本去掉了project.json后,如何生成跨平台包
到这里就进入今天的正题了,对于最新版本netcore去掉project.json网上讨论的还算比较激烈,但是网搜了下还没有一篇正式的中文文章来讲述如果生成夸平台包,这里有幸或许吧成为第一篇吧呵呵;首先,要明了netcore小组去掉project.json重要文件后,其任务都放在了项目的.csproj文件中,没错就是咋们vs生成的项目工程文件,那上面测试用例为例我们看下.csproj文件的内容:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<PackageTargetFallback>$(PackageTargetFallback);portable-net+win8+wp8+wpa;</PackageTargetFallback>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Session" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.0" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0" />
</ItemGroup>
</Project>
这里能够直观的在ItemGroup节点看到我们添加进来的Session的引用和项目模板自带的Logging等的引用,已经父节点 Project Sdk="Microsoft.NET.Sdk.Web" ,我们要生成跨平台运行包,就需要操作这个项目文件的配置信息,这里只需要添加如下代码:
<PropertyGroup>
<RuntimeIdentifiers>win7-x;ubuntu..-x</RuntimeIdentifiers>
</PropertyGroup>
然后再通过发布命令就能够生成夸平台包了,是不是挺简单的,所以上面弄了一个Session小节做干货呢呵呵;咋们来测试下吧,首先在项目根目录这样以此执行命令:dontnet restore
再执行你简短的发布命令(这里我直接采用默认参数的方式执行,发布包会生成再bin下面):dotnet publish
这个时候我们能够在目录:bin\Debug\netcoreapp1.1下面看到publish文件夹,里面就是咋们程序执行文件了,为了测试下效果,这里我通过命令:dontnet WebApp.dll (由于我这里安装了sdk所以可以直接这样命令运行)来运行我的测试用例项目:
到这里一个windows上运行的包就完成了,有朋友就开始疑惑那跨平台呢,还有您之前配置的 <RuntimeIdentifiers>win7-x;ubuntu..-x</RuntimeIdentifiers> 有什么效果呢,那这里就开始演示怎么生成ubunt..-x的运行包了(win7-x的也同样方式);我们同样需要经过:dontnet restore 之后发布命令的时候这样写:
dotnet publish -f netcoreapp1.1 --runtime ubuntu..-x
命令说明:
-f:framework的缩写;
netcoreapp1.1:是存放的文件夹;
--runtime:运行命令必须要的;
ubuntu..-x:存储的文件夹名称
最后的结果是在目录:Debug\netcoreapp1.1 下面生成了一个ubuntu..-x文件夹,里面就是咋们的运行程序包了;如果你想生成其他系统的运行包也是同样的操作流程:
1. 在项目.csproj中添加对应的Runtime命令(如:win7-x;osx.--x;ubuntu..-x);
2. 在dotnet publish的时候把最后一个参数改成对应的Runtime命令就行了(如:ubuntu..-x)
到此本文就结束了,希望能给您带来好的帮助,谢谢阅读;
asp.netmvc和asp.netcore的区别?
ASP.NET MVC 和 ASP.NET Core 之间存在着明显的区别,但通过可替换的 NuGet 包,这些差距被显著缩小,仅在极少数情况下需要第三方包来解决。下面列出了主要的差异点,以直观解答题目中的问题。
首先,架构方面,ASP.NET MVC 是基于 Web Forms 的,而 ASP.NET Core 采用的是更加现代、轻量级的架构。ASP.NET MVC 提供了更强大的模板引擎和更灵活的路由机制,使得开发 Web 应用变得更加高效。
其次,依赖库和框架。ASP.NET MVC 使用 ASP.NET Framework,主要依赖于 .NET Framework 的功能,而 ASP.NET Core 则采用 .NET Core,具有更好的跨平台兼容性,支持 Windows、Linux 和 MacOS 等多种操作系统。
在开发环境和部署上,ASP.NET Core 旨在简化开发过程和提高性能。它支持热加载,使得开发过程中无需重启服务器即可看到更改的效果。同时,ASP.NET Core 也提供了更丰富的开发工具,如 Visual Studio Code、WebStorm 等,使得开发体验更加流畅。
安全方面,ASP.NET Core 提供了更为严格的安全策略和功能,如身份验证、授权和跨站脚本防护等,以确保 Web 应用的稳定性和安全性。
此外,ASP.NET Core 在性能和资源消耗上也优于 ASP.NET MVC。它优化了内存使用和 CPU 利用率,提供了更快的启动时间和更短的响应时间,适合构建高性能的 Web 应用。
总结而言,尽管 ASP.NET MVC 和 ASP.NET Core 存在一些显著的区别,但通过使用可替换的 NuGet 包,开发者可以无缝地将 MVC 应用迁移到 Core,以充分利用其现代架构、跨平台支持、开发效率和安全性能优势。对于新项目而言,推荐使用 ASP.NET Core,以确保获得最佳的 Web 开发体验和应用性能。
ASP.NET Core认è¯åçåå®ç°
é常å¨åºç¨ç¨åºä¸ï¼å®å ¨å为åå两个æ¥éª¤ï¼éªè¯åææãéªè¯è´è´£æ£æ¥å½å请æ±è ç身份ï¼èææåæ ¹æ®ä¸ä¸æ¥å¾å°ç身份å³å®å½å请æ±è æ¯å¦è½å¤è®¿é®ææçèµæºã
æ¢ç¶å®å ¨ä»éªè¯å¼å§ï¼æ们ä¹å°±ä»éªè¯å¼å§ä»ç»å®å ¨ã
æ们å ä»æ¯è¾ç®åçåºæ¯å¼å§èèï¼ä¾å¦å¨ Web API å¼åä¸ï¼éè¦éªè¯è¯·æ±æ¹æ¯å¦æä¾äºå®å ¨ä»¤çï¼å®å ¨ä»¤çæ¯å¦ææãå¦ææ æï¼é£ä¹ API 端åºè¯¥æç»æä¾æå¡ãå¨å½åç©ºé´ Microsoft.AspNetCore.Authentication ä¸ï¼å®ä¹å ³äºéªè¯çæ ¸å¿æ¥å£ã对åºçç¨åºéæ¯ Microsoft.AspNetCore.Authentication.Abstractions.dllã
å¨ ASP.NET ä¸ï¼éªè¯ä¸å å« 3 个åºæ¬æä½ï¼
éªè¯æä½è´è´£åºäºå½å请æ±çä¸ä¸æï¼ä½¿ç¨æ¥èªè¯·æ±ä¸çä¿¡æ¯ï¼ä¾å¦è¯·æ±å¤´ãCookie ççæ¥æé ç¨æ·æ è¯ãæ建çç»ææ¯ä¸ä¸ª AuthenticateResult 对象ï¼å®æ示äºéªè¯æ¯å¦æåï¼å¦ææåçè¯ï¼ç¨æ·æ è¯å°å¯ä»¥å¨éªè¯ç¥¨æ®ä¸æ¾å°ã
常è§çéªè¯å æ¬ï¼
å¨ææ管çé¶æ®µï¼å¦æç¨æ·æ²¡æå¾å°éªè¯ï¼ä½æææ访é®çèµæºè¦æ±å¿ é¡»å¾å°éªè¯çæ¶åï¼æææå¡ä¼ååºè´¨è¯¢ãä¾å¦ï¼å½å¿åç¨æ·è®¿é®åéèµæºçæ¶åï¼æè å½ç¨æ·ç¹å»ç»å½é¾æ¥çæ¶åãæææå¡ä¼éè¿è´¨è¯¢æ¥ç¸åºç¨æ·ã
ä¾å¦
质询æä½åºè¯¥è®©ç¨æ·ç¥éåºè¯¥ä½¿ç¨ä½ç§éªè¯æºå¶æ¥è®¿é®è¯·æ±çèµæºã
å¨ææ管çé¶æ®µï¼å¦æç¨æ·å·²ç»éè¿äºéªè¯ï¼ä½æ¯å¯¹äºå ¶è®¿é®çèµæºå¹¶æ²¡æå¾å°è®¸å¯ï¼æ¤æ¶ä¼ä½¿ç¨æç»æä½ã
ä¾å¦ï¼
æç»è®¿é®å¤çåºè¯¥è®©ç¨æ·ç¥éï¼
å¨è¿ä¸ªåºæ¯ä¸ï¼å¯ä»¥çå°ï¼éªè¯éè¦æä¾çåºæ¬åè½å°±å æ¬äºéªè¯åéªè¯å¤±è´¥åçæç»æå¡ä¸¤ä¸ªæä½ãå¨ ASP.NET Core ä¸ï¼éªè¯è¢«ç§°ä¸º Authenticateï¼æç»è¢«ç§°ä¸º Forbidã å¨ä¾æ¶è´¹è 访é®çç½ç«ä¸ï¼å¦ææ们å¸æå¨éªè¯å¤±è´¥åï¼ä¸æ¯å API ä¸æ ·ç´æ¥è¿åä¸ä¸ªé误页é¢ï¼èæ¯å°ç¨æ·å¯¼èªå°ç»å½é¡µé¢ï¼é£ä¹ï¼å°±è¿éè¦å¢å ä¸ä¸ªæä½ï¼è¿ä¸ªæä½çæ¬è´¨æ¯å¸æç¨æ·å次æä¾å®å ¨åæ®ï¼å¨ ASP.NET Core ä¸ï¼è¿ä¸ªæä½è¢«ç§°ä¸º Challengeãè¿ 3 个æä½ç»åå¨ä¸èµ·ï¼å°±æ¯éªè¯æåºæ¬çè¦æ±ï¼ä»¥æ¥å£å½¢å¼è¡¨ç¤ºï¼å°±æ¯ IAuthenticationHandler æ¥å£ï¼å¦ä¸æ示ï¼
éªè¯çç»ææ¯ä¸ä¸ª AuthenticateResult 对象ãå¼å¾æ³¨æçæ¯ï¼å®è¿æä¾äºä¸ä¸ªéææ¹æ³ NoResult() ç¨æ¥è¿å没æå¾å°ç»æï¼éææ¹æ³ Fail() çæä¸ä¸ªè¡¨ç¤ºéªè¯å¼å¸¸çç»æï¼è Success() æååéè¦æä¾éªè¯ç¥¨æ®ã
éè¿éªè¯ä¹åï¼ä¼è¿åä¸ä¸ªå å«äºè¯·æ±è 票æ®çéªè¯ç»æã
å¨ GitHub ä¸æ¥ç AuthenticateResult æºç
é£ä¹éªè¯çä¿¡æ¯æ¥èªåªéå¢ï¼é¤äºåé¢ä»ç»ç 3 个æä½ä¹å¤ï¼è¿è¦æ±ä¸ä¸ªåå§åçæä½ Initializeï¼éè¿è¿ä¸ªæ¹æ³æ¥æä¾å½å请æ±çä¸ä¸æä¿¡æ¯ã
å¨ GitHub ä¸æ¥ç IAuthenticationHandler å®ä¹
æçæ¶åï¼æ们è¿å¸ææä¾ç»åºæä½ï¼å¢å ç»åºæä½çæ¥å£è¢«ç§°ä¸º IAuthenticationSignOutHandlerã
å¨ GitHub ä¸æ¥ç IAuthenticationSignOutHandler æºç
å¨ç»åºçåºç¡ä¸ï¼å¦æè¿å¸ææä¾ç»å½æä½ï¼é£ä¹å°±æ¯ IAuthenticationSignInHandler æ¥å£ã
å¨ GitHub ä¸æ¥ç IAuthenticationSignInHandler æºç
ç´æ¥å®ç°æ¥å£è¿æ¯æ¯è¾éº»ç¦çï¼å¨å½åç©ºé´ Microsoft.AspNetCore.Authentication ä¸ï¼å¾®è½¯æä¾äºæ½è±¡åºç±» AuthenticationHandler 以æ¹ä¾¿éªè¯æ§å¶å¨çå¼åï¼å ¶å®æ§å¶å¨å¯ä»¥ä»è¯¥æ§å¶å¨æ´¾çï¼ä»¥åå¾å ¶æä¾çæå¡ã
éè¿ç±»çå®ä¹å¯ä»¥çå°ï¼å®ä½¿ç¨äºæ³åãæ¯ä¸ªæ§å¶å¨åºè¯¥æä¸ä¸ªå¯¹åºè¯¥æ§å¶å¨çé ç½®é项ï¼éè¿æ³åæ¥æå®éªè¯å¤çå¨æ使ç¨çé 置类åï¼å¨æé å½æ°ä¸ï¼å¯ä»¥çå°å®è¢«ç¨äºè·å对åºçé ç½®é项对象ã
å¨ GitHub ä¸æ¥ç AuthenticationHandler æºç
éè¿ InitializeAsync()ï¼éªè¯å¤çå¨å¯ä»¥è·å¾å½å请æ±çä¸ä¸æ对象 HttpContextã
æç»ï¼ä½ä¸ºæ½è±¡ç±»ç ï¼å¸ææ´¾çç±»æ¥å®æè¿ä¸ªéªè¯ä»»å¡ï¼æ½è±¡æ¹æ³ HandleAuthenticateAsync() æä¾äºæ©å±ç¹ã
éªè¯çç»ææ¯ä¸ä¸ª AuthenticateResultã
èæç»æå¡åç®åçå¤ï¼ç´æ¥å¨è¿ä¸ªæ½è±¡åºç±»ä¸æä¾äºé»è®¤å®ç°ãç´æ¥è¿å HTTP ã
å©ä¸çä¸ä¸ªä¹ä¸æ ·ï¼æä¾äºé»è®¤å®ç°ãç´æ¥è¿å HTTP ååºã
å¯¹äº JWT æ¥è¯´ï¼å¹¶ä¸æ¶åå°ç»å ¥åç»åºï¼æ以å®éè¦ä»å®ç° IAuthenticationHandler æ¥å£çæ½è±¡åºç±» AuthenticationHandler æ´¾çåºæ¥å³å¯ãä» AuthenticationHandler æ´¾çåºæ¥ç JwtBearerHandler å®ç°åºäºèªå·±çé ç½®é项 JwtBearerOptionsãæ以该类å®ä¹å°±åå¾å¦ä¸æ示ï¼èæé å½æ°æ¾ç¶é åäºæ½è±¡åºç±»çè¦æ±ã
å¨ GitHub ä¸æ¥ç JwtBearerHandler æºç
çæ£çéªè¯åå¨ HandleAuthenticateAsync() ä¸å®ç°ãä¸é¢ç代ç æ¯ä¸æ¯å°±å¾çæäºï¼ä»è¯·æ±å¤´ä¸è·åé带ç JWT 访é®ä»¤çï¼ç¶åéªè¯è¯¥ä»¤ççæææ§ï¼æ ¸å¿ä»£ç å¦ä¸æ示ã
å¨ GitHub ä¸æ¥ç JwtBearerHandler æºç
å¨ ASP.NET Core ä¸ï¼ä½ å¯ä»¥ä½¿ç¨åç§éªè¯å¤çå¨ï¼å¹¶ä¸ä» ä» åªè½ä½¿ç¨ä¸ä¸ªï¼éªè¯æ§å¶å¨éè¦ä¸ä¸ªå称ï¼å®è¢«çä½è¯¥éªè¯æ¨¡å¼ Schema çå称ãJwt éªè¯æ¨¡å¼çé»è®¤åç§°å°±æ¯ "Bearer"ï¼éè¿å符串常é JwtBearerDefaults.AuthenticationScheme å®ä¹ã
å¨ GitHub ä¸æ¥ç JwtBearerDefaults æºç
æç»éè¿ AuthenticationBuilder çæ©å±æ¹æ³ AddJwtBearer() å° Jwt éªè¯æ§å¶å¨æ³¨åå°ä¾èµæ³¨å ¥ç容å¨ä¸ã
å¨ GitHub ä¸æ¥ç JwtBearerExtensions æ©å±æ¹æ³æºç
ä¸ç§éªè¯å¤çå¨ï¼å ä¸å¯¹åºçéªè¯é ç½®é项ï¼æ们å为å®èµ·ä¸ä¸ªååï¼ç»åèµ·æ¥å°±æ为ä¸ç§éªè¯æ¶æ Schemaãå¨ ASP.NET Core ä¸ï¼å¯ä»¥æ³¨åå¤ç§éªè¯æ¶æãä¾å¦ï¼ææçç¥å¯ä»¥ä½¿ç¨æ¶æçå称æ¥æå®æ使ç¨çéªè¯æ¶ææ¥ä½¿ç¨ç¹å®çéªè¯æ¹å¼ãå¨é ç½®éªè¯çæ¶åï¼é常设置é»è®¤çéªè¯æ¶æãå½æ²¡ææå®éªè¯æ¶æçæ¶åï¼å°±ä¼ä½¿ç¨é»è®¤æ¶æè¿è¡å¤çã
è¿å¯ä»¥
注åçéªè¯æ¨¡å¼ï¼æç»åæ AuthenticationSchemeï¼æ³¨åå°ä¾èµæ³¨å ¥æå¡ä¸ã
å¨ GitHub ä¸æ¥ç AuthenticationScheme æºç
åç§éªè¯æ¶æ被ä¿åå°ä¸ä¸ª IAuthenticationSchemeProvider ä¸ã
å¨ GitHub ä¸æ¥ç IAuthenticationSchemeProvider æºç
æç»ç使ç¨æ¯éè¿ IAuthenticationHandlerProvider æ¥å®ç°çï¼éè¿ä¸ä¸ªéªè¯æ¨¡å¼çå符串å称ï¼å¯ä»¥åå¾æ对åºçéªè¯æ§å¶å¨ã
å¨ GitHub ä¸æ¥ç IAuthenticationHandlerProvider æºç
å®çé»è®¤å®ç°æ¯ AuthenticationHandlerProviderï¼æºç 并ä¸å¤æã
å¨ GitHub ä¸æ¥ç AuthenticationHandlerProvider æºç
éªè¯ä¸é´ä»¶çå¤ç就没æé£ä¹å¤æäºã
æ¾å°é»è®¤çéªè¯æ¨¡å¼ï¼ä½¿ç¨é»è®¤éªè¯æ¨¡å¼çå称åå¾å¯¹åºçéªè¯å¤çå¨ï¼å¦æéªè¯æåçè¯ï¼æå½å请æ±ç¨æ·ç主ä½æ¾å°å½å请æ±ä¸ä¸æç User ä¸ã
éé¢è¿æä¸æ®µç¹å«ç代ç ï¼ç¨æ¥æ¾åºåªäºéªè¯å¤çå¨å®ç°äº IAuthenticationHandlerProviderï¼å¹¶ä¾æ¬¡è°ç¨å®ä»¬ï¼ççæ¯å¦éè¦æåç»æ¢è¯·æ±å¤çè¿ç¨ã
å¨ GitHub ä¸æ¥ç AuthenticationMiddle æºç