学习ASP.NET Core的身份认证(基于Session的身份认证3)

开源博客项目Blog中提供了另一种访问控制方式,其基于自定义类及函数的特性类控制访问权限。本文学习并测试开源博客项目Blog的访问控制方式,测试程序中直接复用开源博客项目Blog中的相关类及接口定义,并在其上调整判断逻辑。
  首先是接口AllowAccessAttribute,用于标识函数是否需要访问控制。

csharp 复制代码
[AttributeUsage(AttributeTargets.Method)]
public class AllowAccessAttribute : Attribute
{}

然后定义特定类AuthorizationAttribute ,用于标识并处理指定控制器类的访问控制,在类中实现OnAuthorization函数,这里调整了原博客项目Blog的访问控制逻辑(Blog项目使用基于Cookie的身份认证,其在函数内使用HttpContext.User相关信息进行登录判断),函数的输入参数AuthorizationFilterContext中包含有待访问的控制器类及函数信息(如下截图所示),可以据此做更详细的访问控制。

csharp 复制代码
public class AuthorizationAttribute : Attribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        bool ignore = ((ControllerActionDescriptor)context.ActionDescriptor).MethodInfo.GetCustomAttributes(false).Any(f => f is AllowAccessAttribute);
        if (!ignore)
        {
            if (!context.HttpContext.Session.IsAvailable ||
                string.IsNullOrEmpty(context.HttpContext.Session.GetString("user")))
            {
                context.Result= new RedirectToRouteResult(
                            new RouteValueDictionary
                            {
                                { "controller", "Account" },
                                { "action", "Login" }     
                            });
                return;
            }
        }
    }
}

在测试项目中的使用示例如下所示,最终程序的运行效果是访问Home/Privacy可以直接看到页面,放在Home/Index的话,如果没有登录则跳转到登录页面。

csharp 复制代码
[Authorization]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        ViewData.Add("CurUser", HttpContext.Session.GetString("user"));
        return View();
    }
    
    [AllowAccess]
    public IActionResult Privacy()
    {
        return View();
    }
}

参考文献:

1\]https://www.cnblogs.com/boonya/p/18557417 \[2\]http://www.pzhseo.com/article/dipjeg.html \[3\]https://cloud.tencent.com/developer/article/1783650 \[4\]https://blog.csdn.net/ousetuhou/article/details/135392012 \[5\]https://blog.51cto.com/u_16213593/11106992 \[6\]https://blog.csdn.net/weixin_30371469/article/details/97157033

相关推荐
绿蕉7 天前
身份认证:筑牢接入防线,规避非法节点风险
身份认证
庞轩px7 天前
JWT与Session比较
jwt·session·登录鉴权·无状态
无风听海7 天前
.NET10之HttpContext.RequestServices 深入解析
.net·asp.net core
硅基喵8 天前
聊聊 ASP.NET Core 中间件和过滤器的区别
asp.net core
happymaker062611 天前
深入了解会话跟踪技术、过滤器、EL、JSTL
web开发·token·cookie·session·el·jstl
小邓的技术笔记17 天前
Serilog:从结构化日志认知到 .NET 工程落地
asp.net core·结构化日志·可观测性·serilog
硅基喵18 天前
Serilog:从结构化日志认知到 .NET 工程落地
asp.net core·可观测性
七夜zippoe23 天前
OpenClaw 核心概念详解:Session、Agent、Skill
agent·session·skill·分层架构·openclaw
૮・ﻌ・23 天前
Node.js - 04:MongoDB、会话控制
数据库·mongodb·node.js·jwt·token·cookie·session
硅基喵24 天前
ASP.NET Core 外部依赖调用治理实战:HttpClientFactory、Polly 与幂等边界
asp.net core·架构设计