using Furion.Authorization;
|
using Furion.DataEncryption;
|
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Http;
|
|
namespace HStation.WebApi
|
{
|
/// <summary>
|
/// JWT 授权自定义处理程序
|
/// </summary>
|
public class JwtHandler : AppAuthorizeHandler
|
{
|
/// <summary>
|
/// 自动刷新Token
|
/// </summary>
|
/// <param name="context"></param>
|
/// <returns></returns>
|
public override async Task HandleAsync(AuthorizationHandlerContext context)
|
{
|
//执行顺序 1 线程6
|
var accessTokenExpire = Yw.Settings.AuthParasHelper.Auth.JWT.AccessTokenExpire;
|
var refreshTokenExpire = Yw.Settings.AuthParasHelper.Auth.JWT.RefreshTokenExpire;
|
|
if (JWTEncryption.AutoRefreshToken(context, context.GetCurrentHttpContext(), accessTokenExpire, refreshTokenExpire))
|
{
|
await AuthorizeHandleAsync(context);
|
}
|
else
|
{
|
context.Fail(); // 授权失败
|
}
|
|
}
|
|
/// <summary>
|
/// 请求管道
|
/// </summary>
|
/// <param name="context"></param>
|
/// <param name="httpContext"></param>
|
/// <returns></returns>
|
public override Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
|
{
|
// 此处已经自动验证 Jwt token的有效性了,无需手动验证
|
|
// 检查权限,如果方法是异步的就不用 Task.FromResult 包裹,直接使用 async/await 即可
|
|
//执行顺序 2 线程6
|
return Task.FromResult(CheckAuthorzie(httpContext));
|
}
|
|
/// <summary>
|
/// 检查权限
|
/// </summary>
|
/// <param name="httpContext"></param>
|
/// <returns></returns>
|
private static bool CheckAuthorzie(DefaultHttpContext httpContext)
|
{
|
// 获取权限特性
|
var securityDefineAttribute = httpContext.GetMetadata<SecurityDefineAttribute>();
|
if (securityDefineAttribute == null)
|
return true;
|
return true;
|
}
|
|
|
}
|
}
|