C# 临时块休息控制器
在我们的应用程序中,我们通过REST与IIS服务通信。所有控制器类都用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用户”角色中的所有用户 我们是否可以使用默认行为,或者必须在每个控制器中检查此行为?据我所知,
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>