Я не удивлен, что вокруг этого вопроса катались вьючки.Нет ничего плохого в подходе, который я подробно описал в этом вопросе.
Оказывается, проблема заключалась в том, что я использовал пользовательский IInstanceProvider
(я даже не думал включать эту информацию).Если я перестаю использовать провайдера пользовательских экземпляров, все работает нормально.Но это бесполезно, так как я все еще хочу его использовать.
Поэтому я обнаружил, что единственным решением было вручную установить текущий принципал потока внутри провайдера экземпляра.
Хитрость заключалась в том, чтобы овладетьпринципал, который я установил в IAuthorizationPolicy
- мне удалось в конце концов найти его, используя довольно громоздкий вызов через статический OperationContext.Current
.
public object GetInstance(InstanceContext instanceContext, Message message)
{
var principal =
OperationContext.Current.ServiceSecurityContext.AuthorizationContext.Properties["Principal"]
as MyPrincipal;
if (principal != null)
Thread.CurrentPrincipal = principal;
return ObjectFactory.GetInstance(_serviceType);
}
Конечно, мне было бы интересно узнать,есть более элегантное решение.