开源博客项目Blog中提供了另一种访问控制方式,其基于自定义类及函数的特性类控制访问权限。本文学习并测试开源博客项目Blog的访问控制方式,测试程序中直接复用开源博客项目Blog中的相关类及接口定义,并在其上调整判断逻辑。
首先是接口AllowAccessAttribute,用于标识函数是否需要访问控制。
[AttributeUsage(AttributeTargets.Method)]
public class AllowAccessAttribute : Attribute
{}
然后定义特定类AuthorizationAttribute ,用于标识并处理指定控制器类的访问控制,在类中实现OnAuthorization函数,这里调整了原博客项目Blog的访问控制逻辑(Blog项目使用基于Cookie的身份认证,其在函数内使用HttpContext.User相关信息进行登录判断),函数的输入参数AuthorizationFilterContext中包含有待访问的控制器类及函数信息(如下截图所示),可以据此做更详细的访问控制。
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的话,如果没有登录则跳转到登录页面。
[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