标签:
源代码GitHub:https://github.com/ZhaoRd/Zrd_0001_AuthorityManagement
权限验证过程中,如何判断所有过程是一个难点,少判断一个过程,那么这个验证就不完整。
本节主要介绍了在这个Demo中使用的验证原理以及过程
在上一章中说道验证过程主要是依赖mvc的controller和action,通过attribute采集信息。
在mvc中,添加IAuthorizationFilter接口的实现类,实现OnAuthorization方法,所有的权限验证均在这个方法内完成,在FilterConfig类中注册该实现,代码如下:![]()
我们通过判断AllowAnonymousAttribute是不是匿名访问,通过判断SystemModelAttribute是不是系统模块,通过判断NeedLoginedAttribute是不是需要登录访问,通过判断PermissionSettingAttribute是不是具有权限限制。
1. 匿名访问
namespace AuthorityManagement.Web.Filters
{
using System;
using System.Text;
using System.Web.Mvc;
using System.Web.Security;
using Presentation.Attributes;
using Presentations;
using Presentations.Attributes;
using Skymate;
using Skymate.Engines;
using AllowAnonymousAttribute = System.Web.Http.AllowAnonymousAttribute;
/// <summary>
/// The my authorization filter.
/// </summary>
public class MyAuthorizationFilter : IAuthorizationFilter
{
/// <summary>
/// The on authorization.
/// </summary>
/// <param name="filterContext">
/// The filter context.
/// </param>
public void OnAuthorization(AuthorizationContext filterContext)
{
var actionDescriptor = filterContext.ActionDescriptor;
var controllerDescriptor = filterContext.ActionDescriptor.ControllerDescriptor;
// 匿名一律绿灯通行
var isAllowAnonymou = actionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), false);
if (isAllowAnonymou)
{
return;
}
// 非系统模块,一律通行
var isSystemModel = controllerDescriptor.IsDefined(typeof(SystemModelAttribute), false);
if (!isSystemModel)
{
return;
}
// 需要登录访问
var isNeedLogined = actionDescriptor.IsDefined(typeof(NeedLoginedAttribute), false)
|| controllerDescriptor.IsDefined(typeof(NeedLoginedAttribute), false);
var userId = string.Empty;
if (isNeedLogined)
{
var authCookie = filterContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null)
{
filterContext.Result = new HttpUnauthorizedResult();
return;
}
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket == null || authTicket.UserData == string.Empty)
{
filterContext.Result = new HttpUnauthorizedResult();
return;
}
userId = authTicket.UserData;
}
var isSetPermission = actionDescriptor.IsDefined(typeof(PermissionSettingAttribute), false);
// 如果没有设置具体权限,一律通过
if (!isSetPermission)
{
return;
}
var systemModelAttribute = (SystemModelAttribute)controllerDescriptor.GetCustomAttributes(typeof(SystemModelAttribute), false)[0];
var permissionSetting =
(PermissionSettingAttribute)
actionDescriptor.GetCustomAttributes(typeof(PermissionSettingAttribute), false)[0];
var datatokens = filterContext.RequestContext.RouteData.DataTokens["area"];
// 计算area
var areaName = datatokens == null ? string.Empty : datatokens.ToString();
var groupName = systemModelAttribute.GroupName ?? areaName;
var permissionService = EngineContext.Current.Resolve<IPermissionService>();
var isAllowed = permissionService.VerifyAuthority(new VerifyAuthorityInputDto()
{
LoginUserId = Guid.Parse(userId),
GroupName = groupName,
PermissionValue = permissionSetting.PermissionValue,
SystemModelName = systemModelAttribute.Name
});
if (!isAllowed && filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult
{
Data = OperationResult.Error("无操作权限"),
ContentEncoding = Encoding.UTF8,
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
return;
}
if (!isAllowed)
{
filterContext.HttpContext.Response.Redirect("~/401.html");
}
}
}
}
推荐QQ群:
278252889(AngularJS中文社区)
5008599(MVC EF交流群)
134710707(ABP架构设计交流群 )
59557329(c#基地 )
230516560(.NET DDD基地 )
本人联系方式:QQ:351157970
标签:
原文地址:http://www.cnblogs.com/zhaord/p/4899993.html