如何拒绝角色/用户访问除指定异常之外的所有控制器/操作 asp.net MVC

How to deny a role / user access to all Controllers / Actions apart from specified exceptions asp.net MVC

我希望能够指定不允许访问的用户的角色和当所有其他用户都允许时指定整个站点。

然后我希望能够对选定的操作执行授权 header 的操作,以便在可能的情况下仍允许被拒绝的用户访问该选定的操作和控制器。

我知道我可以创建一个角色,将所有其他用户添加到这个角色,然后在这个角色上做一个授权属性,但这必须在每个动作上完成,这是 non-starter 因为项目已经构建了数百个甚至数千个操作。

如有任何建议,我们将不胜感激

此处最简单的解决方案可能是使用自定义授权属性来添加拒绝功能。您可以通过多种方式实现这一点。例如,您可以根据特定角色进行拒绝,但随着时间的推移可能难以维护,如果您想拒绝来自应用程序不同部分的人,您必须每次都创建不同的角色并更改代码这样做。

例如:

public class DenyAttribute : AuthorizeAttribute 
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return !base.AuthorizeCore(httpContext);
    }
}

这使用 AuthorizeAttribute 的角色 属性 作为拒绝。

[Deny(Roles="DeniedUsers")]

但请注意,您需要某种更高级别的授权,例如在控制器或全局过滤器级别阻止所有未经身份验证的用户,否则它将允许任何不在指定角色中的人访问,包括未经身份验证的用户。所以也许添加如下内容:

return httpContext.User.IsAuthenticated && !base.AuthorizeCore(httpContext);

另请注意,将其与 [AllowAnonymous] 结合使用可能会出现问题。

另一种选择是创建一个更灵活的系统,该系统将根据当前 controller/action 计算拒绝。像这样:

public class DenyByControllerActionAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var controller = httpContext.Request.RequestContext.RouteData.GetRequiredString("controller");
        var action = httpContext.Request.RequestContext.RouteData.GetRequiredString("action");
        var denyRole = string.Format("Deny{0}:{1}", controller, action);
        return !httpContext.User.IsInRole(denyRole) && base.AuthorizeCore(httpContext);
    }
}

然后您可以通过将用户添加到 "Deny{Controller}:{Action}" 格式的角色来控制访问权限,例如 DenyHome:Index 或 "DenyAdmin:Email".

这也将要求他们通过调用基本的 AuthorizeCore 功能具有默认授权访问权限。因此,您可以用 `[DenyByControllerAction] 对 [Authorize] 进行批量替换,它的工作方式相同(或将其用作全局过滤器),但只需添加角色,您就可以拒绝任何用户访问任何 Controller/Action.