繁体   English   中英

除了指定的例外,如何拒绝角色/用户对所有控制器/操作的访问asp.net MVC

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

我希望能够指定一个角色(该角色不允许其他用户访问)和整个网站(而其他所有用户均可)。

然后,我希望能够对选定的动作执行authorize标头的内容,以便在可能的情况下仍允许拒绝的用户访问此选定的动作和控制器。

我知道我可以创建一个角色,将所有其他用户添加到该角色中,然后对该角色执行授权属性,但是这必须对每个非启动者的动作都必须执行,因为该项目已经用数百个构建了。没有数千个动作。

因此,任何建议将不胜感激

这里最简单的解决方案可能是添加“拒绝”功能的自定义Authorize属性。 您可以通过多种方式来实现。 例如,您可以基于特定角色进行拒绝,但是如果您想拒绝应用程序不同部分的人员,那么随着时间的流逝很难维护,那么您就必须创建不同的角色并每次更改代码要做到这一点。

例如:

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

这将AuthorizeAttribute的Roles属性用作拒绝。

[Deny(Roles="DeniedUsers")]

但是请注意,您将需要某种更高级别的授权,例如在Controller或全局筛选器级别,以阻止所有未经身份验证的用户,否则,它将允许未指定角色的任何人(包括未经身份验证的用户)都有权访问。 因此,也许添加类似以下内容:

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

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

另一个选择是创建一个更灵活的系统,该系统将基于当前的控制器/操作来计算拒绝。 像这样:

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功能。 因此,您可以将[Authorize]替换为`[DenyByControllerAction],它的工作方式相同(或将其用作全局过滤器),但只需添加该角色即可拒绝任何用户访问任何Controller / Action 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM