2013-04-29 4 views

ответ

1

Перехватчики для служб передачи данных WCF представляют собой, по существу, лямбда-выражения типа Expression<Func<T, bool>> для каждого объекта, который у вас есть в вашем источнике данных (more about interceptors), это ограничивает вас довольно простыми и почти статическими правилами авторизации. С другой стороны, XACML является очень гибким и динамическим решением для авторизации. Я не могу думать о возможном общем способе интеграции. В то же время, не являющиеся родовые интеграции довольно просты:

[QueryInterceptor ("Customers")] 
public Expression<Func<Customer, bool>> FilterCustomers() 
{ 

    // First of all you need to get all request attributes 
    // information could come from session, from cookies 
    // from request, in this example I will only use subjectId 
    // In XACML subjectId could be user name 
    var subjectId = GetSubjectId(); 

    // After you have all data, build XACML request 
    // this code is specific to our XACML implementation 
    var xacmlRequest = new XacmlDecisionRequestContext() 
     .AddRequest(r => r 
      .AddResource(a => a.Add(XacmlConstants.ResourceAttributes.ResourceId, new Uri("Customer", UriKind.RelativeOrAbsolute)))    
      .AddSubject(a => a.Add(XacmlConstants.SubjectAttributes.SubjectId, subjectId)) 
     ); 

    // Evaluate request 
    var result = PolicyDecisionPoint.Evaluate(xacmlRequest); 

    // Based on XACML decision result you can construct expression 
    // this example is simple true or false, but based on 
    // XACML Advices or XACML Attributes you can build much more 
    // sophisticated expression 

    if (result.Decisions.Single().Decision == XacmlDecision.Permit) 
    { 
     return() => true; 
    } 
    return() => false; 
} 

В этом примере предполагается, что перехватывать доступ к лицу клиента. И он работает только для запроса. Вы должны поместить этот метод в класс DataService.

Пример основан на Axiomatics PEP SDK для .NET (я работаю над этим продуктом), но идея будет применяться к любой реализации XACML.

+0

Перехватчики на этом уровне не предлагают управление доступом на основе атрибутов (ABAC). Это означает, что вы можете ограничить доступ к определенной коллекции, но не к объектам внутри этой коллекции. –

+0

Вы правы, в WCF нет точки расширения, которая обеспечивает одно место, чтобы проверить, разрешен ли доступ для отдельной записи. Это хорошая причина для этого. Он будет просто медленным (выберите n + 1 проблему). Итак, в конце вы должны иметь выражение > ', которое фактически представляет политику XACML. Для таких сценариев мы предлагаем перехватить [на нижнем уровне] (http://www.axiomatics.com/component/rsevents/event/17-webinar-xacml-meets-sql.html). Короче говоря, он меняет SQL-запрос на включение условий. Теоретически та же идея применима для выражения 'Func >'. –