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
wReadFromStreamAsync
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
główny w metodzie kontrolera nie jest już głównym ustawieniem w MessageHandler, tj. nazwa użytkownika,Authenticated
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
w MessageHandler iw metodzie kontrolera. „Czasami” są różne, a następnie główny „traci”.
Szukałem teraz alternatywy dla ustawieńThread.CurrentPrincipal
w jakiś sposób bezpiecznie przenieść zleceniodawcę z niestandardowego narzędzia MessageHandler do metody kontrolera i inten wpis na blogu 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
klasa (która jest w przestrzeni nazwSystem.Web.Http.Hosting
) nie maUserPrincipalKey
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 toHttpPropertyKeys.UserPrincipalKey
... 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
właściwość nie zawiera głównego dodanego doProperties
kolekcja powyżej.