Теперь мы хотим реализовать механизм для временного блокирования всех пользователей, которые находятся в роли «CompApi-User» для всех контроллеров.
Так каждый раз что вам это нужно, вы не хотите нового развертывания. Вы просто хотите изменить конфиг.
Вы также хотите это для всех контроллеров, это означает, что вам нужно что-то вроде глобального фильтра действий.
И последнее, что вы, вероятно, хорошо знаете, но стоит отметить, что отрицать не равно удалению роли из разрешенных ролей. Это означает, что вам следует запретить доступ, если пользователь находится в определенной роли c, независимо от других ролей, которые у него есть и которым он может быть предоставлен.
Вот атрибут:
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;
}
}
Просто зарегистрируйте его в Register
методе WebApiConfig
:
config.Filters.Add(new DenyAccessAttribute());
Затем каждый раз, когда вы хотите отказать в роли, как только вы добавите ее в DeniedRoles
в настройках приложения доступ к роли будет запрещен для всех контроллеров:
<appSettings>
<add key="DeniedRoles" value="Admin,PowerUser"/>
<appSettings>
Примечание:
- Запрещены все роли, указанные в
DeniedRoles
в appsettings
независимо от предоставленного им доступа. - Он также запрещает им доступ ко всем контроллерам, независимо от того, разрешены ли они анонимно. Если вы хотите оставить анонимный доступ таким, каким он был, просто прокомментируйте
OnAuthorization
, чтобы использовать поведение по умолчанию. - Если вам нужна дополнительная настройка, взгляните на исходный код AuthorizeAttribute.cs на GitHub.
- Вам не обязательно выводить из
AuthorizeAttribute
, вы также можете получать из AuthorizationFilterAttribute
.