asp.net core razor和api 都同时支持登录身份判断属性写法

浪淘沙2周前后端22
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
 {


相关文章

普能html页面post到 cshtml页面,出现400错误解决方法

  [IgnoreAntiforgeryToken]  public class keywordsModel : PageModel  {    &n...

Razor 遍历 DataTable

@using System.Data <table class="table table-bordered table-striped&n...

asp.net core SqlSugar 多库切换

  private readonly SqlSugar.ISqlSugarClient _db;     ...

asp.net core [BindProperty] 用法

在 ASP.NET Core 中,[BindProperty] 是一种用于绑定模型属性的特性,通常与 Razor 页面配合使用。它会自动将请求中的表单数据绑定到页面模型的属性上,简化了手动从 Requ...

_LayoutAdmin.cshtml 取得url,调用ViewComponent 视图

_LayoutAdmin.cshtml 取得url,调用ViewComponent 视图

<body id="watermark-parent"> @{ var name = Furion.App.HttpC...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。