网站首页 网站源码
using System.IdentityModel.Tokens.Jwt;
using System.Text;
using Dpz.Core.EnumLibrary;
using Hangfire.Dashboard;
using Microsoft.AspNetCore.Authentication;
using Microsoft.IdentityModel.Tokens;
namespace Dpz.Core.Web.Jobs.Hangfire;
public class HangfireFilter : IDashboardAuthorizationFilter
{
private readonly IConfiguration _configuration;
public HangfireFilter(IConfiguration configuration)
{
_configuration = configuration;
}
public bool Authorize(DashboardContext context)
{
var httpContext = context.GetHttpContext();
if (httpContext == null)
throw new Exception("HttpContext is null");
var tokenValue = httpContext.Request.Cookies[Program.AuthorizeCookieName];
if (string.IsNullOrEmpty(tokenValue))
{
httpContext.Response.Redirect("/sign.html");
return false;
}
var signKey = _configuration["SignKey"];
if (string.IsNullOrEmpty(signKey))
throw new Exception("configuration SignKey is null");
var tokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = "jobs-server",
ValidAudience = "jobs-client",
ValidateIssuer = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(signKey)),
ValidateLifetime = true
};
var principal =
new JwtSecurityTokenHandler().ValidateToken(tokenValue, tokenValidationParameters,
out var securityToken);
if (principal.Identity?.IsAuthenticated != true ||
securityToken is not JwtSecurityToken jwtSecurityToken)
{
return false;
}
var permissions = jwtSecurityToken.Claims.FirstOrDefault(x => x.Type == "Permissions");
if (permissions == null ||
!Enum.TryParse(permissions.Value, out Permissions value) || !value.HasFlag(Permissions.System))
{
return false;
}
return true;
}
}
上述代码定义了一个名为 HangfireFilter
的类,它实现了 IDashboardAuthorizationFilter
接口,用于对 Hangfire 的仪表板进行授权控制。Hangfire 是一个用于处理后台任务的库,通常用于 ASP.NET 应用程序中。以下是代码的主要功能和工作原理的详细解释:
public HangfireFilter(IConfiguration configuration)
{
_configuration = configuration;
}
IConfiguration
对象,用于读取应用程序的配置设置(例如,密钥等)。public bool Authorize(DashboardContext context)
Authorize
方法是实现 IDashboardAuthorizationFilter
接口的核心方法,用于检查用户是否有权访问 Hangfire 仪表板。var httpContext = context.GetHttpContext();
if (httpContext == null)
throw new Exception("HttpContext is null");
DashboardContext
中获取 HttpContext
,如果为 null
,则抛出异常。var tokenValue = httpContext.Request.Cookies[Program.AuthorizeCookieName];
if (string.IsNullOrEmpty(tokenValue))
{
httpContext.Response.Redirect("/sign.html");
return false;
}
/sign.html
)并返回 false
,表示未授权。var signKey = _configuration["SignKey"];
if (string.IsNullOrEmpty(signKey))
throw new Exception("configuration SignKey is null");
SignKey
),如果为空,则抛出异常。var tokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = "jobs-server",
ValidAudience = "jobs-client",
ValidateIssuer = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(signKey)),
ValidateLifetime = true
};
TokenValidationParameters
对象,设置有效的发行者、受众、签名密钥等参数,以便在验证 JWT 时使用。var principal =
new JwtSecurityTokenHandler().ValidateToken(tokenValue, tokenValidationParameters,
out var securityToken);
JwtSecurityTokenHandler
验证 JWT 令牌,并获取用户的主体(ClaimsPrincipal
)。if (principal.Identity?.IsAuthenticated != true ||
securityToken is not JwtSecurityToken jwtSecurityToken)
{
return false;
}
JwtSecurityToken
类型。如果不满足条件,则返回 false
。var permissions = jwtSecurityToken.Claims.FirstOrDefault(x => x.Type == "Permissions");
if (permissions == null ||
!Enum.TryParse(permissions.Value, out Permissions value) || !value.HasFlag(Permissions.System))
{
return false;
}
Permissions.System
权限)。如果没有权限,则返回 false
。return true;
true
,表示用户被授权访问 Hangfire 仪表板。该代码的主要功能是通过验证 JWT 令牌来控制对 Hangfire 仪表板的访问。它确保只有经过身份验证并具有特定权限的用户才能访问该仪表板。