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

时间:2017-02-07 14:25:38

标签: asp.net asp.net-mvc

我正在MVC项目中实现授权/身份验证。我遇到的问题是登录用户有很多条件,例如rolespositionspermissions和其他一些用户。我认为最好的方法是覆盖AthorizeAttribute并通过在构造函数中将数据作为字符串数组传递来设置其中的所有逻辑并验证它们但我确实拥有超过100个权限和超过40个位置,这使得此属性几乎无用因为我无法在每个动作中写出例如60个位置等。

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

我在一些帖子中用红色创建了一个基本控制器,以便在那里进行所有验证,但我使用的是ASP.NET身份,而且我不喜欢进入旧版本的#39;时尚方式...

如果有任何人有这样的情况,我会感激您分享您的解决方案!

编辑 - 添加代码示例

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个角色和权限等......这只是一个获得想法的演示,因为在我的项目中我没有像我在这里那样的角色。

1 个答案:

答案 0 :(得分:1)

不是将角色硬编码到属性中,最好创建一个自定义通用[XAuthorizeAction]属性,该属性将启动检查数据库以进行权限配置的过程。

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

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

步骤3.)Inside属性确定调用者和调用控制器以及操作

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

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