Временный блок REST-контроллеров - PullRequest
2 голосов
/ 07 февраля 2020

В нашем приложении мы общаемся с IIS-сервисом через REST. Все классы контроллеров имеют атрибут Authorize, например:

[Authorize(Roles = "CompApi-User, CompApi-Administration")]
public class ComponentsController : ApiController
{ ... }

. Теперь мы хотим реализовать механизм временной блокировки всех пользователей, которые находятся в «CompApi-User» -Роле для всех контроллеров.

Есть ли поведение по умолчанию, которое мы можем использовать, или нужно проверять это в каждом контроллере?

Ответы [ 3 ]

2 голосов
/ 10 февраля 2020

Теперь мы хотим реализовать механизм для временного блокирования всех пользователей, которые находятся в роли «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.
1 голос
/ 10 февраля 2020

Насколько я знаю, нет встроенного или стандартного поведения для временной блокировки всех пользователей, которые находятся в "CompApi-User" -Роль всех контроллеров.

Для достижения ie эта вещь, вы должны написать коды самостоятельно. Вам нужно создать собственный атрибут Authorize, чтобы добавить функциональность Deny. Затем вы должны добавить его к каждому контроллеру.

В функции deny вы можете написать коды для запрета роли в соответствии с настройкой web.config для достижения временной блокировки.

Подробнее о том, как создать пользовательский атрибут Authorize, вы могли бы обратитесь к этому ответу .

0 голосов
/ 10 февраля 2020

Если вы временно блокируете доступ к целому ряду действий контроллеров, и если вы используете IIS для запуска веб-сайта, то вы можете легко перенаправить все эти методы с помощью модуля перенаправления HTTP в IIS - просто добавьте правила в веб .config и перенаправить пользователей на страницу 404 (или код страницы 401/403). Когда вы закончите, просто закомментируйте эти правила (чтобы вы могли редактировать / использовать их позже).

...