学习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();
    }
}

参考文献:

1https://www.cnblogs.com/boonya/p/18557417

2http://www.pzhseo.com/article/dipjeg.html

3https://cloud.tencent.com/developer/article/1783650

4https://blog.csdn.net/ousetuhou/article/details/135392012

5https://blog.51cto.com/u_16213593/11106992

6https://blog.csdn.net/weixin_30371469/article/details/97157033

相关推荐
j7~2 天前
【Linux网络加餐】《HTTP 会话保持:Cookie 与 Session 原理及实验验证》---详解
linux·网络·网络协议·http·cookie·session
AIGC大时代2 天前
OpenAI Agents SDK 工程笔记:自定义 Session 接口(get_items / add_items / clear)与多租户隔离的生产禁区
session·多租户·agents sdk·生产禁区·get_items
承渊政道6 天前
Linux网络学习【深入理解应用层HTTP协议、Cookie与Session机制及HTTPS协议原理】
linux·网络·学习·http·cookie·session
大连好光景7 天前
Agent SDK默认将哪三类状态写入本地磁盘?
session·agentsdk·多租户隔离·sessionstore
FungLeo10 天前
成为全栈·Flutter App 篇·会员中心:资料、密码、通知与私有数据缓存
flutter·dart·身份认证·数据隔离·成为全栈·会员中心
安当加密030111 天前
动态口令认证如何选型
身份认证·mfa·双因素认证·动态口令认证如何选型·动态口令认证
安当加密-焱垚11 天前
身份认证凭据管理系统
身份认证·凭据管理·身份认证凭据管理系统·登录认证中如何应用凭据管理系统·身份认证中如何应用凭据管理系统
一条泥憨鱼12 天前
【Redis | 黑马点评】短信登录功能 源码深度分析
java·redis·后端·session·黑马点评
躺柒12 天前
读数据安全架构设计与实践03身份认证(上)
网络安全·信息安全·数据安全·安全架构·身份认证
FungLeo13 天前
成为全栈·Flutter App 篇·Refresh Token 旋转与并发 401:安全存储与会话代次
flutter·jwt·移动安全·身份认证·token刷新·成为全栈