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

相关推荐
绿荫阿广2 天前
将SignalR移植到Esp32—让小智设备无缝连接.NET功能拓展MCP服务
.net·asp.net core·mcp
贾修行6 天前
.NET 全栈开发学习路线:从入门到分布式
c#·.net·wpf·asp.net core·web api·winforms·services
捧 花9 天前
HTTP的补充
http·cookie·session·http缓存·工作流程
贾修行10 天前
ASP.NET Core SignalR 从入门到精通:打造实时 Web 应用的利器
websocket·microsoft·asp.net core·signalr·realtime·web-api
梦茹^_^12 天前
flask框架(笔记一次性写完)
redis·python·flask·cookie·session
冷冷的菜哥18 天前
ASP.NET Core调用ffmpeg对视频进行截图,截取,增加水印
开发语言·后端·ffmpeg·asp.net·音视频·asp.net core
清风徐来QCQ24 天前
传统Session和JWT方案的区别
jwt·session
_Orch1d1 个月前
详解SSL/TLS协议握手协议、记录层协议与警报协议
网络·计算机网络·安全·密码学·ssl·身份认证·对称加密