C# 临时块休息控制器

C# 临时块休息控制器,c#,rest,iis,asp.net-web-api,C#,Rest,Iis,Asp.net Web Api,在我们的应用程序中,我们通过REST与IIS服务通信。所有控制器类都用Authorize属性修饰,如: [Authorize(Roles = "CompApi-User, CompApi-Administration")] public class ComponentsController : ApiController { ... } 现在,我们想要实现一种机制来临时阻止所有控制器的“CompApi用户”角色中的所有用户 我们是否可以使用默认行为,或者必须在每个控制器中检查此行为?据我所知,

在我们的应用程序中,我们通过REST与IIS服务通信。所有控制器类都用
Authorize
属性修饰,如:

[Authorize(Roles = "CompApi-User, CompApi-Administration")]
public class ComponentsController : ApiController
{ ... }
现在,我们想要实现一种机制来临时阻止所有控制器的“CompApi用户”角色中的所有用户


我们是否可以使用默认行为,或者必须在每个控制器中检查此行为?

据我所知,没有内置或默认行为来临时阻止所有控制器的“CompApi用户”角色中的所有用户

要理解这件事,你需要自己编写代码。您需要创建自定义授权属性以添加拒绝功能。然后您应该将其添加到每个控制器中

在deny函数中,您可以根据web.config设置编写拒绝角色的代码,以实现临时阻止

有关如何创建自定义授权属性的更多详细信息,您可以参考以下内容

现在我们想要实现一种机制来临时阻止所有 对所有控制器都是“CompApi用户”角色。

因此,每当您需要它时,您都不需要新的部署。您只需要更改配置

您还希望所有控制器都使用它,这意味着您需要全局操作过滤器之类的东西

最后一点,您可能很清楚,但值得一提的是,拒绝并不等于从允许的角色中删除角色。这意味着,如果用户处于特定角色,则应拒绝访问,而不管他们拥有或可能被授予访问权限的其他角色

以下是属性:

using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.Http.Controllers;
public class DenyAccessAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext == null)
            throw new System.ArgumentNullException(nameof(actionContext));
        if (!IsAuthorized(actionContext))
            HandleUnauthorizedRequest(actionContext);
    }
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        var user = actionContext.ControllerContext.RequestContext.Principal;
        if (!(user == null || user.Identity == null))
        {
            var roles = GetDeniedRoles();
            if (roles != null && roles.Count() > 0 && roles.Any(user.IsInRole))
                return false;
        }
        return base.IsAuthorized(actionContext);
    }
    public virtual IEnumerable<string> GetDeniedRoles()
    {
        var config = System.Configuration.ConfigurationManager
            .AppSettings["DeniedRoles"];
        var roles = config?.Split(',').Select(x => x.Trim())
            .Where(x => !string.IsNullOrEmpty(x));
        return roles;
    }
}
然后,每次您要拒绝角色时,只要将其添加到appsettings中的
DeniedRoles
,所有控制器都将拒绝访问该角色:

<appSettings>
    <add key="DeniedRoles" value="Admin,PowerUser"/>
<appSettings>
GitHub上的

  • 您不一定需要从
    authorizationAttribute
    派生,也可以从
    AuthorizationFilterAttribute
    派生

  • 如果您暂时阻止对所有控制器操作的访问,并且使用IIS运行网站,那么您可以使用IIS中的HTTP重定向模块轻松重定向所有这些方法-只需将规则添加到web.config并将用户转移到404页面(或编写401/403页面代码)。完成后,只需注释掉这些规则(以便以后可以编辑/重用)。

    如果我没有弄错的话,有几种方法可以做到这一点,但我不确定这是否适用于您的需要。您可以通过配置
    或扩展
    授权过滤器论坛
    和注册
    全局配置.Configuration.Filters.Add(新建扩展授权)
    来拒绝或允许用户我想说,您定义了该组中的用户始终允许使用此函数。一般来说,您应该暂时从当前拥有这些角色的所有用户中删除这些角色。他们希望禁用对特定角色的访问。不是所有的角色。
    <appSettings>
        <add key="DeniedRoles" value="Admin,PowerUser"/>
    <appSettings>