Существуют ли проверенные шаблоны, которыми кто-либо может поделиться со службами Workflow 4.0, интегрированными с Windows Identity Foundation?Мы ищем лучший способ проверить токен STS и утверждения, чтобы определить, кто является пользователем вне контекста экземпляра службы рабочего процесса, и сделать объект пользователя приложения доступным для контекста рабочего процесса.
Мы хотим разделить задачи между реализацией сервиса WIF и бизнес-логикой рабочего процесса, чтобы наши сервисы рабочего процесса были легко тестируемыми.Мы видели несколько предоставленных примеров, которые указывают на обертывание действия Receive с действием кода, которое создает реализацию IReceiveMessageCallback для получения ссылки на OperationContext. Ссылка на сообщение в блоге Мориса. Однако это означает, что действия, выполняемые внутри службы, зависят от существования контекста операции и, возможно, даже от IClaimsIdentity.
Лучшее решение, которое мы можем найти на данный момент, - это создать реализацию IDispatchMessageInspector для службы, которая опрашивает токен и создает пользовательские объекты приложения, необходимые рабочему процессу, делая их доступными для среды выполнения рабочего процесса через InstanceContext.Расширения.Кажется, это работает, но не совсем точно.Любая помощь или обратная связь с благодарностью!
Поведение службы
public class SecurityTokenServiceBehavior : IServiceBehavior, IDispatchMessageInspector
{
...
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
var claimsPrincipal = (IClaimsPrincipal)(Thread.CurrentPrincipal is GenericPrincipal ? null : Thread.CurrentPrincipal);
...
instanceContext.Extensions.Add(new SecurityContextExtension(appUser, audit));
return null;
}
...
}
IReceiveMessageCallback
public class SecurityContextCallback : IReceiveMessageCallback
{
[DataMember]
public SecurityContextExtension SecurityContext { get; private set; }
public void OnReceiveMessage(OperationContext operationContext, ExecutionProperties activityExecutionProperties)
{
SecurityContext = operationContext.InstanceContext.Extensions.Find<SecurityContextExtension>();
}
}