Asp.Net Core 6 与 SignalR 使用 JWT 身份验证

JWT 是什么? 这一点网上有很多的描述了,在此就不多赘述。总之,JWT 的 Token 通常由三部分组成:Header,Payload 和 Signature. Header 中包含了该 Token 所使用的签名算法;Payload 中则含有一些需要传递的信息;Signature 则是对 Header 和 Payload 的签名,用以校验前两部分有没有被篡改。 在 Asp.Net Core Web Api 中集成 JWT 安装 Nuget 包 首选我们需要安装三个 Nuget 包,分别是: Microsoft.AspNetCore.Authentication.JwtBearer Microsoft.IdentityModel.Tokens; System.IdentityModel.Tokens.Jwt; JWT 相关参数配置 在appsettings.json文件中,我们添加以下配置: "JwtConfiguration": { "AccessSecret": "123456", "RefreshSecret": "654321", "Issuer": "this", "Audience": "that", "AccessExpiration": 3600, "RefreshExpiration": 2592000, "ClockSkew": 60 } 以上配置中,具体字段名和内容可以自行修改。 然后我们新建一个类,用于反序列化配置内容: /// <summary> /// JWT Token配置 /// </summary> public class JwtConfiguration { /// <summary> /// AccessToken密钥 /// </summary> public string AccessSecret { get; set; } = string....

March 9, 2022 · 4 分钟 · Remo

React使用Day.js通过Vite发布后报错

问题描述 最近在React项目中使用了 Day.js 来处理需要在 Ant Design 列表中显示的一个时间数据,在本地开发过程中一直没出问题,vite build发布以后,列表每次加载数据都会报错:TypeError: $ is not a function以及Error: Minified React error #31;. 后面发现将使用 Day.js 相关方法注释后,加载数据就恢复正常了。经过搜索,发现这篇博文,虽然文中的报错信息和我遇到的不一样,但是解决方式是相同的。 解决方式 不要使用 import dayjs from 'dayjs'或者 import * as dayjs from 'dayjs' 方式引入 Day.js ,应当改用: import dayjs from 'dayjs/esm/index.js' 这样修改后,就可以正常使用了。

January 12, 2022 · 1 分钟 · Remo

ASP.NET 6 修改 WebRoot 路径

问题 最近的项目中需要修改 Web Root 路径,按照老方法发现报异常,于是 Google 得知相关方法在 ASP.NET 6 中有所修改。 代码 ASP.NET 5 public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { //这里指定新位置 webBuilder.UseWebRoot("webroot") .UseStartup<Startup>(); }); ASP.NET 6 var builder = WebApplication.CreateBuilder(new WebApplicationOptions { Args = args, //这里指定新位置,也可以使用绝对路径 WebRootPath = "webroot" }); var app = builder.Build(); 若要修改 Content Root 路径也可以在这里一并修改。 总结 根据微软官方文档解释: Content 根目录是指向以下内容的基路径: 托管应用的可执行文件 (.exe)。 构成应用程序的已编译程序集 (.dll)。 应用使用的内容文件,例如:...

December 23, 2021 · 1 分钟 · Remo

Asp.Net Core使用Quartz.NET实现简单定时任务

所需 Nuget 包 Quartz.AspNetCore Quartz Quartz.Extensions.DependencyInjection Quartz.Extensions.Hosting 本示例仅需从nuget安装第一个包即可,其他三个包会通过依赖关系自动安装。 示例代码 本文基于.NET 6最新的模板。 新建一个cs文件,如ExampleJob.cs: [DisallowConcurrentExecution] public class ExampleJob : IJob { public async Task Execute(IJobExecutionContext context) { try { //这里是需要定时执行的相关代码 } catch (Exception e) { //异常处理 } } } 在Program.cs中添加: builder.Services.AddQuartz(config => { config.UseDefaultThreadPool(options => { options.MaxConcurrency = 2; }); config.UseMicrosoftDependencyInjectionJobFactory(); config.ScheduleJob<ExampleJob>(trigger => trigger .WithIdentity("ExampleTrigger") //立即开始第一次执行 .StartNow() //此后每次执行的间隔,这里是1小时,并且一直重复下去 .WithSimpleSchedule(x=>x.WithIntervalInHours(1).RepeatForever()) .WithDescription("A simple example")); }); // Quartz.Extensions.Hosting hosting builder....

December 7, 2021 · 1 分钟 · Remo

AspectCore 配合 Log4Net 全局记录Asp.Net Core Web Api异常日志

配置AspectCore-Framework 首先通过Nuget安装AspectCore.Extensions.DependencyInjection。 接下来我们可以配置拦截器: //继承自AbstractInterceptorAttribute public class CustomInterceptorAttribute : AbstractInterceptorAttribute { public override async Task Invoke(AspectContext context, AspectDelegate next) { try { Console.WriteLine("调用前"); await next(context);//执行调用的方法等 } catch (Exception ex) { Console.WriteLine("捕获到异常"); throw; } finally { Console.WriteLine("调用结束"); } } } 然后在Startup.cs中的ConfigureServices方法中配置代理(.NET6中对应的是builder.Services) services.ConfigureDynamicProxy(config => { services.AddTransient<IExmapleService, ExmapleService>(); services.AddControllers(); config.Interceptors.AddTyped<CustomInterceptorAttribute>(Predicates.ForService("*Service")); config.Interceptors.AddTyped<CustomInterceptorAttribute>(Predicates.ForService("*Controller")); }); 以上配置是对名称以Service或Controller结尾的进行代理,还有其他一些规则如: //全部代理 config.Interceptors.AddTyped<CustomInterceptorAttribute>(); //名称以Execute开头的方法会被代理 config.Interceptors.AddTyped<CustomInterceptorAttribute>(Predicates.ForMethod("Execute*")); //以Service结尾则不会被代理 config.NonAspectPredicates.AddService("Service"); //更多详细规则可以查阅官方文档 //https://github.com/dotnetcore/AspectCore-Framework/blob/master/docs/1.%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.md ...... 也可以通过NonAspectAttribute对Service或Method进行单独设置: //无论在Startup.cs中如何配置,该接口都不会通过代理 [NonAspect] public interface IExampleService { void Method(); } 最后在Program....

February 27, 2021 · 2 分钟 · Remo