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