From fdec9ed6b8a2fd704a5efe7b3f8afd604d44ef34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Sat, 16 Nov 2024 13:10:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81hangfire=E9=AA=8C?= =?UTF-8?q?=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../YiTokenAuthorizationFilter.cs | 122 ++++++++++++++++++ Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs | 14 +- 2 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 Yi.Abp.Net8/framework/Yi.Framework.BackgroundWorkers.Hangfire/YiTokenAuthorizationFilter.cs diff --git a/Yi.Abp.Net8/framework/Yi.Framework.BackgroundWorkers.Hangfire/YiTokenAuthorizationFilter.cs b/Yi.Abp.Net8/framework/Yi.Framework.BackgroundWorkers.Hangfire/YiTokenAuthorizationFilter.cs new file mode 100644 index 00000000..eeb0171b --- /dev/null +++ b/Yi.Abp.Net8/framework/Yi.Framework.BackgroundWorkers.Hangfire/YiTokenAuthorizationFilter.cs @@ -0,0 +1,122 @@ +using Hangfire.Dashboard; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Users; + +namespace Yi.Framework.BackgroundWorkers.Hangfire; + +public class YiTokenAuthorizationFilter : IDashboardAsyncAuthorizationFilter, ITransientDependency +{ + private const string Bearer = "Bearer: "; + private string RequireUser { get; set; } = "cc"; + private TimeSpan ExpiresTime { get; set; } = TimeSpan.FromMinutes(10); + private IServiceProvider _serviceProvider; + + public YiTokenAuthorizationFilter(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public YiTokenAuthorizationFilter SetRequireUser(string userName) + { + RequireUser = userName; + return this; + } + + public YiTokenAuthorizationFilter SetExpiresTime(TimeSpan expiresTime) + { + ExpiresTime = expiresTime; + return this; + } + + public bool Authorize(DashboardContext context) + { + var httpContext = context.GetHttpContext(); + var _currentUser = _serviceProvider.GetRequiredService(); + //如果验证通过,设置cookies + if (_currentUser.IsAuthenticated) + { + var cookieOptions = new CookieOptions + { + Expires = DateTimeOffset.Now + ExpiresTime, // 设置 cookie 过期时间,10分钟 + }; + + + var authorization = httpContext.Request.Headers["Authorization"].ToString(); + if (!string.IsNullOrWhiteSpace(authorization)) + { + var token = httpContext.Request.Headers["Authorization"].ToString().Substring(Bearer.Length - 1); + httpContext.Response.Cookies.Append("Token", token, cookieOptions); + } + + if (_currentUser.UserName == RequireUser) + { + return true; + } + } + + SetChallengeResponse(httpContext); + return false; + } + + private void SetChallengeResponse(HttpContext httpContext) + { + httpContext.Response.StatusCode = 401; + httpContext.Response.ContentType = "text/html; charset=utf-8"; + string html = """ + + + + + + Token 输入 + + + +

Yi-hangfire

+

输入您的Token,我们将验证您是否为管理员

+ + + + + """; + httpContext.Response.WriteAsync(html); + } + + public Task AuthorizeAsync(DashboardContext context) + { + return Task.FromResult(Authorize(context)); + } +} \ No newline at end of file diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs b/Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs index 78415229..b22be9fb 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs +++ b/Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs @@ -25,6 +25,7 @@ using Volo.Abp.BackgroundJobs.Hangfire; using Volo.Abp.BackgroundWorkers; using Volo.Abp.BackgroundWorkers.Hangfire; using Volo.Abp.Caching; +using Volo.Abp.Hangfire; using Volo.Abp.MultiTenancy; using Volo.Abp.Swashbuckle; using Yi.Abp.Application; @@ -257,12 +258,19 @@ namespace Yi.Abp.Web { OnMessageReceived = context => { + //优先Query中获取,再去cookies中获取 var accessToken = context.Request.Query["access_token"]; if (!string.IsNullOrEmpty(accessToken)) { context.Token = accessToken; } - + else + { + if (context.Request.Cookies.TryGetValue("Token",out var cookiesToken)) + { + context.Token = cookiesToken; + } + } return Task.CompletedTask; } }; @@ -366,10 +374,10 @@ namespace Yi.Abp.Web //日志记录 app.UseAbpSerilogEnrichers(); - //Hangfire定时任务面板,可配置授权 + //Hangfire定时任务面板,可配置授权,意框架支持jwt app.UseAbpHangfireDashboard("/hangfire", options => { - // options.AsyncAuthorization = new[] { new AbpHangfireAuthorizationFilter() }; + options.AsyncAuthorization = new[] { new YiTokenAuthorizationFilter(app.ApplicationServices) }; }); //终节点