asp.net core razor和api 都同时支持登录身份判断属性写法
using Microsoft.AspNetCore.Mvc.Filters;namespace xxtsoft.Application.Filters{
/// <summary>
/// 登录验证特性
/// 同时支持:
/// 1. Furion DynamicApi / MVC Controller
/// 2. Razor Page
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class ApiAuthorizeAttribute : Attribute, IAsyncActionFilter, IAsyncPageFilter
{
/// <summary>
/// 检查当前用户是否登录
/// 这里使用 Session 判断
/// </summary>
private bool CheckLogin(HttpContext context)
{
var session = context.Session; var teaid = session.GetString("teaid"); var teaxm = session.GetString("teaxm"); var teabm = session.GetString("teabm"); // 三个关键字段都存在,认为登录有效
return !string.IsNullOrEmpty(teaid)
&& !string.IsNullOrEmpty(teaxm)
&& !string.IsNullOrEmpty(teabm); }
/// <summary>
/// API / Furion DynamicApi 请求验证
/// 例如:
/// [ApiAuthorize]
/// public class HbExtService : IDynamicApiController
/// </summary>
public async Task OnActionExecutionAsync(
ActionExecutingContext context, ActionExecutionDelegate next)
{
// 未登录
if (!CheckLogin(context.HttpContext))
{
// API 返回 JSON
context.Result = new JsonResult(new
{
code = 401,
msg = "登录已失效,请重新登录"
}); return; }
// 登录有效,继续执行接口方法
await next(); }
/// <summary>
/// Razor Page 请求验证
/// 例如:
/// [ApiAuthorize]
/// public class indexModel : PageModel
/// </summary>
public async Task OnPageHandlerExecutionAsync(
PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
{
// 未登录
if (!CheckLogin(context.HttpContext))
{
// Razor 页面跳转到登录页
context.Result = new RedirectToPageResult("/hb/login"); return; }
// 登录有效,继续执行 OnGet / OnPost
await next(); }
/// <summary>
/// Razor Page Handler选择阶段
/// 必须实现,但这里不需要处理
/// </summary>
public Task OnPageHandlerSelectionAsync(
PageHandlerSelectedContext context)
{
return Task.CompletedTask; }
}}用法:
[ApiAuthorize]public class indexModel : PageModel{ [ApiAuthorize]
public class HbExtService : IDynamicApiController, ITransient
{
