Jak mogę bezpiecznie ustawić główny użytkownik w niestandardowym interfejsie WebAPI HttpMessageHandler?

Dla podstawowego uwierzytelnienia zaimplementowałem niestandardowyHttpMessageHandler na podstawie przykładu pokazanego w odpowiedzi Darina Dimitrowa tutaj:https://stackoverflow.com/a/11536349/270591

Kod tworzy instancjęprincipal typuGenericPrincipal z nazwą użytkownika i rolami, a następnie ustawia tę zasadę na bieżącą zasadę wątku:

Thread.CurrentPrincipal = principal;

PóźniejApiController metoda główna może być odczytana przez dostęp do kontrolerówUser własność:

public class ValuesController : ApiController
{
    public void Post(TestModel model)
    {
        var user = User; // this should be the principal set in the handler
        //...
    }
}

Wydawało się, że działa dobrze, dopóki ostatnio nie dodałem niestandardowegoMediaTypeFormatter który używaTask taka biblioteka:

public override Task<object> ReadFromStreamAsync(Type type, Stream readStream,
    HttpContent content, IFormatterLogger formatterLogger)
{
    var task = Task.Factory.StartNew(() =>
    {
        // some formatting happens and finally a TestModel is returned,
        // simulated here by just an empty model
        return (object)new TestModel();
    });
    return task;
}

(Mam takie podejście, aby rozpocząć zadanieTask.Factory.StartNew&nbsp;wReadFromStreamAsync&nbsp;z jakiegoś przykładowego kodu. Czy to źle i może jedyny powód problemu?)

Teraz „czasami” - a dla mnie wydaje się być losowa -User&nbsp;główny w metodzie kontrolera nie jest już głównym ustawieniem w MessageHandler, tj. nazwa użytkownika,Authenticated&nbsp;flaga i role są stracone. Powodem wydaje się być to, że niestandardowy MediaTypeFormatter powoduje zmianę wątku między MessageHandler a metodą kontrolera. Potwierdziłem to, porównując wartościThread.CurrentThread.ManagedThreadId&nbsp;w MessageHandler iw metodzie kontrolera. „Czasami” są różne, a następnie główny „traci”.

Szukałem teraz alternatywy dla ustawieńThread.CurrentPrincipal&nbsp;w jakiś sposób bezpiecznie przenieść zleceniodawcę z niestandardowego narzędzia MessageHandler do metody kontrolera i inten wpis na blogu&nbsp;używane są właściwości żądania:

request.Properties.Add(HttpPropertyKeys.UserPrincipalKey,
    new GenericPrincipal(identity, new string[0]));

Chciałem to sprawdzić, ale wygląda na to, żeHttpPropertyKeys&nbsp;klasa (która jest w przestrzeni nazwSystem.Web.Http.Hosting) nie maUserPrincipalKey&nbsp;już w ostatnich wersjach WebApi (kandydat do wydania i ostatnia wersja z ostatniego tygodnia).

Moje pytanie brzmi: jak mogę zmienić ostatni fragment kodu powyżej, aby działał z bieżącą wersją WebAPI? Lub ogólnie: w jaki sposób mogę ustawić główny użytkownik w niestandardowym programie MessageHandler i uzyskać do niego niezawodny dostęp w metodzie kontrolera?

Edytować

Jest wspomnianytutaj&nbsp;toHttpPropertyKeys.UserPrincipalKey&nbsp;... postanawia“MS_UserPrincipal”„, więc próbowałem użyć:

request.Properties.Add("MS_UserPrincipal",
    new GenericPrincipal(identity, new string[0]));

Ale to nie działa tak, jak oczekiwałem: TheApiController.User&nbsp;właściwość nie zawiera głównego dodanego doProperties&nbsp;kolekcja powyżej.