WIF и авторизация на основе логики помимо ролей (также для отключения кнопок)

У нас есть серверная часть Asp.Net-Web-Api и клиентская часть wpf (Desktop).

Подойдет ли решение WIF (Windows Identity Foundation), если:

  • нам нужно не только заблокировать доступ к web-api, но и передать информацию о правах авторизации на сторону клиента, чтобы отключить кнопки?
  • авторизация основана не только на ролях. Права авторизации различаются в зависимости от типа действия и типа объекта, к которому может быть применено действие? Например, действие может быть «attach_document», а объект — «Проект». Или "edit_subentities" для определенного экземпляра "SuperEntity"...?
  • также авторизация будет основываться на логике, применяемой как к атрибутам пользователя, так и к свойствам объекта. Чтобы уточнить, у нас есть древовидная структура Организации. Пользователь принадлежит определенной Организации, а Объект должен быть связан с определенной Организацией. Только для некоторых Ролей права определяются тем фактом, является ли Организация Объекта подчиненной Организации Прошедшего проверку пользователя или нет. ...?

Во-вторых (не уверен, что правильно спрашивать),

  • Если WIF подходит, было бы полезно знать любые ключевые слова для поиска в Google о том, как начать реализацию решения для части логики.
  • Есть ли лучшие альтернативы?

Извините, если вопрос слишком широкий или что-то не ясно или неправильно. Было бы полезно знать, что решение WIF — не лучший выбор в нашем случае, прежде чем тратить время на эксперименты. Большое спасибо!


person Andrey K.    schedule 18.02.2016    source источник


Ответы (2)


Взгляните на ABAC (abac), атрибут модель управления доступом. Это обновленная модель, которая вместо того, чтобы просто смотреть на роли (RBAC), рассматривает атрибуты:

  • пользователь, например. должность, отдел, допуск...
  • ресурс, например. классификация и другие атрибуты
  • действие напр. просмотреть, удалить, утвердить
  • контекст / среда, например. время суток, IP-адрес...

Модель ABAC обеспечивает

  • внешняя авторизация (так же, как авторизация на основе утверждений и RBAC)
  • централизованная авторизация: логика авторизации поддерживается в центральном компоненте
  • на основе политик: логика авторизации выражается в виде политик, связывающих вместе атрибуты.

Пример:

  • Пользователь может просмотреть документ, если отдел документа == отдел пользователя И статус документа == ПУБЛИКИРОВАН.

В частности, взгляните на XACML (xacml) . XACML предоставляет внешнее решение для авторизации на основе политик, которое можно применять к приложениям .NET.

Архитектура XACML

РЕДАКТИРОВАНИЕ автором вопроса (взято из википедии):

  • PAP – точка администрирования политик – точка, управляющая политиками авторизации доступа.
  • PDP – точка принятия решения о политике – точка, которая оценивает запросы на доступ в соответствии с политиками авторизации перед выдачей решений о доступе.
  • PEP – точка применения политики – точка, которая перехватывает запрос пользователя на доступ к ресурсу, отправляет запрос решения на PDP для получения решения о доступе (т. е. доступ к ресурсу утверждается или отклоняется) и действует полученное решение
  • PIP — информационная точка политики — системный объект, который действует как источник значений атрибутов (т. е. ресурс, субъект, среда)
  • (PRP) – точка извлечения политик – точка, в которой хранятся политики авторизации доступа XACML, обычно в базе данных или файловой системе.
person David Brossard    schedule 19.02.2016
comment
Большое спасибо! Мы собираемся попробовать. Мы начали создавать собственную простую реализацию на основе концепций, представленных в ABAC и XACML (в сочетании с Claims). Но есть ли уже хорошие простые реализации .Net с открытым исходным кодом? - person Andrey K.; 25.02.2016

При первом же подходе и благодаря вкладу Доминика Байера я придумал нестандартный ClaimsAuthorizationManager . Кажется, что можно использовать WIF в качестве решения.

  • До сих пор не знаю, подходит ли WIF лучше всего.
  • Также возникает вопрос, можно ли совместно использовать логику авторизации между клиентом и сервером. Еще не думал об этом.

Также есть этот пост о похожей проблеме.


Самое первое, что я придумал, это проверить доступ следующим образом:

authorizationManager.CheckAccess("show_subresources", "resource_org_id", "20d55788-bf46-43f0-b6c5-ccb6be687b90");

Проверяю доступ в обязательном порядке. Что касается декларативного подхода с атрибутом [ClaimsPrincipalPermission(....)] над методом, то в нашем случае он, похоже, не работает, потому что resource_organization_id неизвестен, пока ресурс не получен. Самая первая версия менеджера подхода выглядит так:

public class AuthorizationManager : ClaimsAuthorizationManager
{
    public const string ActionType = "http://application/claims/authorization/action";
    public const string ResourceType = "http://application/claims/authorization/resource";

    public override bool CheckAccess(AuthorizationContext context)
    {
        //logic

        return false;
    }

    public bool CheckAccess(string action, params string[] resources)
    {
        var principal = Thread.CurrentPrincipal as ClaimsPrincipal;

        var context = CreateAuthorizationContext(
            principal,
            action,
            resources
            );

        return CheckAccess(context);
    }

    private AuthorizationContext CreateAuthorizationContext(ClaimsPrincipal principal, string action, params string[] resources)
    {
        var actionClaims = new Collection<Claim>
        {
            new Claim(ActionType, action)
        };

        var resourceClaims = new Collection<Claim>();

        if (resources != null && resources.Length > 0)
        {
            resources.ToList().ForEach(ar => resourceClaims.Add(new Claim(ResourceType, ar)));
        }

        return new AuthorizationContext(
            principal,
            resourceClaims,
            actionClaims);
    }
}

Обратите внимание, что я использую Microsoft.IdentityModel пакет nuget для .Net 4.0.

Менеджер должен быть актуализирован через файл app.config:

<configuration>
    <configSections>
        <section name="microsoft.identityModel" type="Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    <configSections>

    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>

    <system.identityModel>
        <identityConfiguration>
            <claimsAuthorizationManager type="ClaimsAuthorizationJustATry.AuthorizationManager, ClaimsAuthorizationJustATry"/>
        </identityConfiguration>
    </system.identityModel>
</configuration>

Но я сделал это так:

FederatedAuthentication.ServiceConfiguration.ClaimsAuthorizationManager = new AuthorizationManager();
person Andrey K.    schedule 19.02.2016