大佬教程收集整理的这篇文章主要介绍了.Net MVC实现角色-API权限验证的一种方式,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
阅文时长 | | 1.15分钟 | 字数统计 | | 1844.8字符 |
主要内容 | | 1、引言&背景 2、部分设计分享 3、声明与参考资料 | ||
『.Net MVC实现角色-API权限验证的一种方式』 | |||
编写人 | | SCschero | 编写时间 | | 2022/3/27 PM9:31 |
文章类型 | | 系列 | 完成度 | | 已完成 |
座右铭 | 每一个伟大的事业,都有一个微不足道的开始。 |
RBAC的权限设计已经应用到越来越多的系统中,然而在一些老项目中,对各个Role可访问的API并未做相关的限制,从而引发高级别的安全漏洞。这里介绍一种简单且比较可靠的设计。
以下是存储"Role-API"对应关系的关系表,如图博主是用了五个字段来存:步长为10主键ID、RolEID、Rolename、Url、APiDesc。其中Rolename和ApiDesc是冗余字段,方便开发者阅读设计的,在缓存中存的对象不需要存Rolename和ApiDesc。
其中有一点需要注意的是URL,一般都是维护成/Area/Controller/Action。
AjaxAuthorizeAttribute是自定义的重写身份验证特性的类。以下为一个通用设计。其中需要注意的是第2步骤,在取AuthorizationContext中的请求路由时,有几种取数方式,注意区别。在以下代码示例中有一些解释可以参考。
public class AjaxAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//1. 从缓存中取数据的Obj对象,并将Obj转换为实体对象。(转换方式是否最优有待思考优化,先不做讨论)
IList objList = (IList)CacheDataLogic.CacheHelper.GetData(ParameterNames.CacheRoleresourceAll);
var res = objList.Cast<MMC_RoleresourceMap>();
//ApplicationContext是我们封装的取用户上下文的类
var Rolename = ((RoleModel)CacheDataLogic.CacheHelper.GetData(ParameterNames.CacheclientUserRole + ApplicationContext.Current.LoginUserInfo.UserModel.UserID)).Rolename;
//2. 取当前用户API集合是否包含请求集合。
//filterContext.httpContext.request.RawUrl//路由后带参数,取到的数据是带参数的。比如:/SCscCon/SCscAction?scsc=6666。
//filterContext.httpContext.request.Path//可以过滤掉?后的参数,比如:/Claim/SCscAction /?scsc=4430。但无法解决不带?的参数URL。比如: /Claim/ClaimApply/4430
var spA = filterContext.httpContext.request.Path.Split('/');//如果上一种不是想用来判断的参数,可以做截取。比如下面这样。
//3. 判断当前用户API集合是否包含请求集合。
if (res.Where(o => o.Rolename == Rolename && o.Url == ("/" + spA[1] + "/" + spA[2])).Count() > 0)
{
base.onAuthorization(filterContext);
}
else
{
httpContext.Current.Response.Redirect("~/AuthorizeError.html");
return;
}
}
}
另外建议大家可以了解一下AuthorizeAttribute对象,其中的各方法的调用顺序可以研究研究,比如HandleUnauthorizedrequest方法等等,都是@R_555_9262@知识点。
用来重定向的通用页html代码,记录一下,后面方便复用。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<meta charset="utf-8" />
</head>
<body>
<hgroup>
<h1>Error.</h1>
<h2>An error occurred while processing your request.</h2>
</hgroup>
</body>
</html>
原创博文,未经许可请勿转载。
如有帮助,欢迎点赞、收藏、关注。如有问题,请评论留言!如需与博主联系的,直接博客私信SCschero即可。
以上是大佬教程为你收集整理的.Net MVC实现角色-API权限验证的一种方式全部内容,希望文章能够帮你解决.Net MVC实现角色-API权限验证的一种方式所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。