学习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

相关推荐
常州北格数字孪生5 天前
宁德时代区块链+数字孪生专利解析:去中心化身份认证重构产业安全底座
区块链·数字孪生·身份认证·宁德时代·专利技术
小王努力学编程9 天前
【Linux网络编程】http协议的状态码,常见请求方法以及cookie-session
linux·服务器·网络·网络协议·http·cookie·session
自由鬼20 天前
开源身份和访问管理(IAM)解决方案:Keycloak
服务器·数据库·安全·开源·身份认证·单点登录
安 当 加 密1 个月前
【安当产品应用案例100集】043-安当物联网数据安全传输方案
物联网·数据安全·身份认证·密钥管理·加密技术·固件签名·轻量化协议
EdisonZhou1 个月前
使用MCP C# SDK开发MCP Server + Client
llm·aigc·asp.net core·.net core
pitt19972 个月前
AI 大模型统一集成|微服务 + 认证中心:如何保障大模型 API 的安全调用!
微服务·spring security·cookie·session·大模型api·认证中心
超软毛毛虫2 个月前
ASP.NET Core 模型验证消息的本地化新姿势
asp.net core·localization
人生偌只如初见2 个月前
NebulaGraph学习笔记-SessionPool之getSession
java·graph·nebula·session·pool
gywl3 个月前
Spring Web MVC入门
spring·json·mvc·注解·cookie·session
lixww.cn3 个月前
ASP.NET Core用MediatR实现领域事件
ddd·asp.net core·mediatr