2013-07-07 10 views
11

Czy jest możliwe, bez poważniejszych hakerów, uzyskanie surowego żądania żądania ServiceStack w Runner?Czy usługa ServiceStack Runner może uzyskać zamówienie?

Piszę dostawcę usług Oauth, aby działał na platformie ServiceStack przy użyciu nowego interfejsu API (usługa i runner). Ze względu na sposób działania podpisu OAuth muszę uzyskać nieprzetworzoną treść żądania dla każdego żądania. Warstwa zabezpieczająca OAuth jest dodawana do Runnera, więc niepoprawne żądanie OAuth może łatwo zwrócić pustą odpowiedź o błędzie bez jakiegokolwiek zestawu znaków w klasie Service lub z podklasy specjalnej klasy "OAuthService".

Odpowiedz

15

Sposób dostępu do surowego ciała żądania to użycie IHttpRequest.GetRawBody() lub odczytanie z IHttpRequest.InputStream.

Jednak ponieważ treść żądania HTTP jest strumieniem tylko do przodu, domyślnie można go wywołać tylko raz, który jest zwykle wywoływany przez usługę ServiceStack w celu deserializacji żądania DTO. Serialization and Deserialization docs pokazać jak powiedzieć ServiceStack pominąć deserializacji żądanie i wstrzyknąć nieprzeczytane żądania Stream do żądania DTO z:

public class Hello : IRequiresRequestStream 
{ 
    /// <summary> 
    /// The raw Http Request Input Stream 
    /// </summary> 
    Stream RequestStream { get; set; } 
} 

Jeśli nadal chcesz ServiceStack deserializacji żądania Dto ale również dostęp do surowego ciała żądania potrzeba powiedzieć ServiceStack do buforowania wniosek przed jego odczytu, co można zrobić, dodając PreRequestFilter:

appHost.PreRequestFilters.Insert(0, (httpReq, httpRes) => { 
    httpReq.UseBufferedStream = true; 
}); 

które teraz pozwala nazwać httpReq.GetRawBody() wielokrotnie lub odczytać bezpośrednio z IHttpRequest.InputStream ponieważ jest teraz buforowane.

+0

To jest mniej więcej to, co robię, ale musiałem użyć refleksji, aby uzyskać IHttpRequest z IRequestContext, którego wolałbym nie robić z oczywistych powodów. Czy istnieje sposób na pobranie IHttpRequest z wewnątrz IServiceRunner . Metoda Execute? –

+1

Odbicie? Po prostu wykonaj 'requestContext.Get ()', aby uzyskać żądanie. – mythz

+0

@mythz czy bezpieczne jest wykonywanie 'httpReq.UżytkownikaBufferedStream = true;' w produkcji? Czy nie jest to normalnie zalecane? – vonec

Powiązane problemy