如何用多个授权条件覆盖ASP.MVC 5中的Authorize属性



我正在MVC项目中实现授权/身份验证。我面临的问题是,登录用户有很多条件,比如rolespositionspermissions和其他一些条件。我认为最好的方法是重写AthorizeAttribute,并通过在构造函数中以字符串数组的形式传递数据来设置其中的所有逻辑,并对其进行验证,但我确实有100多个权限和40多个位置,这使得这个属性几乎没有用,因为我不能在每个操作中都写入,例如60个位置等。

我想我可以以某种方式对它们进行分组,但我可以看出这不是一个好点,因为所有的操作都是动态的,我会为user permissionsuser positions创建大量的分组。

我写了一些帖子,因为我创建了一个基本控制器来进行所有验证,但我使用的是ASP.NET Identity,我不喜欢走"旧"的方式。。。

如果有人以前遇到过这样的情况,如果你能分享你的解决方案,我将不胜感激!

EDIT-添加代码示例

public class XAuthorizeAttribute : AuthorizeAttribute
{
public XAuthorizeAttribute() { }
public XAuthorizeAttribute(params string[] roles)
{
Roles = string.Join(",", roles.Select(x => x));
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
bool isAuthenticAttribute =
(filterContext.ActionDescriptor.IsDefined(typeof(XAuthorizeAttribute), true) ||
filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(XAuthorizeAttribute), true)) &&
filterContext.HttpContext.User.Identity.IsAuthenticated;
if (!isAuthenticAttribute) return;
UrlHelper urlHelper = new UrlHelper(filterContext.RequestContext);
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
IdentityManager.SignInManager.AuthenticationManager.SignOut(
DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalCookie);
}
filterContext.Result = 
new RedirectResult(urlHelper.Action("Index", "Home", new {area = ""}));
base.HandleUnauthorizedRequest(filterContext);
}
}

下面是动作。。。

[XAuthorize("Administrator", "articlelists", "HOD Engineering", "HOD Interior"....)]
public ActionResult Index()
{
return View("Index");
}

正如你所看到的,我只放了4个角色,想象一下放了60个角色和权限等等……这只是一个演示,因为在我的项目中,我并不像这里那样只有角色。

与其将角色硬编码为属性,不如创建一个自定义的通用[XAuthorizeAction]属性,开始检查数据库的权限配置过程。

步骤1.)配置数据库以了解操作级别调用的权限

步骤2.)为需要此级别权限控制的控制器操作创建授权属性

步骤3.)内部属性确定呼叫者和呼叫控制器以及动作

步骤4.)查询该控制器和操作的数据库,以确定操作权限。

步骤5.)查询数据库中的用户权限,看看它们是否与匹配

最新更新