2011-09-21 20 views
10

I utrzymanie internetowej ASP.NET MVC, który używaEmulate ASP.NET uwierzytelnianie cookies

FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 

podpisać użytkowników w (oni skończyć z cookie o nazwie .ASPXAUTH).

Klient chce, żebym dodał funkcję HTML do pliku PDF, więc pakuję bibliotekę wkhtmltopdf i wywołuję ją. Ten kończy się na tym, że polecenie wygląda następująco:

wkhtmltopdf http://example.com/Foo/Edit/42 Foo.pdf 

jednak, że wyniki w tworzeniu PDF ekranie logowania jako agent użytkownika wkhtmltopdf jest przekierowywany, ponieważ nie ma odpowiedniego pliku cookie.

To dobrze, ponieważ, zgodnie z dokumentacją wkhtmltopdf, jest to argument tak:

--cookie <name> <value>   Set an additional cookie (repeatable) 

więc zmodyfikować polecenie być:

wkhtmltopdf --cookie .ASPXAUTH 91C0DE4C... http://example.com/Foo/Edit/42 Foo.pdf 

Jeżeli wartość cookie jest pobierane za pomocą Request.Cookie[".ASPXAUTH"].Value .

Niestety, to nie działa i nie mam pojęcia, dlaczego. Wiem, że ASP.NET odbiera ciasteczko, ponieważ gdy przekierowuję stronę logowania po przekierowaniu, widzę, że została ona ustawiona. Dlaczego program ASP.NET nie akceptuje mojego skopiowanego pliku cookie?

Oto treść wniosku, który pozwala ASP.NET (z Chrome):

GET http://localhost:50189/ReportingMonth/Edit/1193391 HTTP/1.1 
Host: localhost:50189 
Connection: keep-alive 
Cache-Control: max-age=0 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-CA,en;q=0.8,en-US;q=0.6 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Cookie: .ASPXAUTH=C8189041BF69FEF89A834B6F5035B786EC40145FFFBA3DBB6A04973BC58021C73D8D374E3577AA44BC26A784BC8A0C24831CF49FBD596BFFBA42C613E3C2C0C893D1587B7743D051643088BB8BAB667C047E0D1B84D7B76C4AADA7C62AB460D87C954BF9118BF5945E7D325D455CFD13A34C3DD5E597AFDF75D3C8EE76D8488B08ABBF6AE065B4C57CE47CB65AB17D65; language=en; ui-tabs-[object Object]=0 

I oto ten, który przekierowuje do logowania (z wkhtmltopdf):

GET http://localhost:50189/ReportingMonth/Edit/1193391 HTTP/1.1 
Cookie: .ASPXAUTH=C8189041BF69FEF89A834B6F5035B786EC40145FFFBA3DBB6A04973BC58021C73D8D374E3577AA44BC26A784BC8A0C24831CF49FBD596BFFBA42C613E3C2C0C893D1587B7743D051643088BB8BAB667C047E0D1B84D7B76C4AADA7C62AB460D87C954BF9118BF5945E7D325D455CFD13A34C3DD5E597AFDF75D3C8EE76D8488B08ABBF6AE065B4C57CE47CB65AB17D65 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Qt/4.7.1 Safari/533.3 
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 
Connection: Keep-Alive 
Accept-Encoding: gzip 
Accept-Language: en-US,* 
Host: localhost:50189 

Odpowiedz

16

Znalazłem problem. Zauważyłem, że po zmianie pola User-Agent (w skrzypce) na taki sam jak w Chrome, działało dobrze. Zrobiłem więc małe śledzenie sieci i odkryłem this bug on the wkhtmltopdf project page.

Z BŁĄD:

jest to problem pod ASP .NET 4.0, jak się wydaje, że .NET interpretuje ciąg User-Agent „Mozilla/5.0 (Windows; U; Windows NT 6.1; pl -AU) AppleWebKit/532.4 (KHTML, podobnie jak Gecko) Qt/4.6.1 Safari/532.4 "jako nie obsługujące pliki cookie, które moim zdaniem uniemożliwiają korzystanie z opcji --cookie w ASP.

Wygląda więc na to rozwiązanie jest albo dowiedzieć się sposób, aby wkhtmltopdf zmienić to User-Agent nagłówka (nie patrząc obiecująca) lub znaleźć sposób, aby powiedzieć ASP.NET, że aplikacja kliencka nie obsługuje plików cookie.

Dzięki za pomoc Darin Dimitrow.

Aktualizacja

Ok, zorientowali się, jak powiedzieć ASP.NET, że przeglądarka Qt używana przez wkhtmltopdf obsługuje pliki cookie. Musisz utworzyć plik o nazwie qt.browser i zapisać go w katalogu callde App_Browsers w katalogu głównym projektu ASP.NET. Oto, co można umieścić w pliku qt.browser:

<browsers> 
    <!-- Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Qt/4.7.1 Safari/530.1 --> 
    <browser id="Qt" parentID="Safari"> 
     <identification> 
      <userAgent match="Qt/(?'version'(?'major'\d+)(\.(?'minor'\d+)?)\w*)" /> 
     </identification>  

     <capabilities> 
      <capability name="browser"       value="Qt" /> 
      <capability name="version"       value="${version}" /> 
      <capability name="majorversion"     value="${major}" /> 
      <capability name="minorversion"     value="${minor}" /> 
      <capability name="type"       value="Qt${major}" /> 
      <capability name="ecmascriptversion"    value="3.0" /> 
      <capability name="javascript"      value="true" /> 
      <capability name="javascriptversion"    value="1.7" /> 
      <capability name="w3cdomversion"     value="1.0" /> 
      <capability name="tagwriter"      value="System.Web.UI.HtmlTextWriter" /> 
      <capability name="cookies"       value="true" /> 
      <capability name="frames"       value="true" /> 
      <capability name="javaapplets"      value="true" /> 
      <capability name="supportsAccesskeyAttribute"  value="true" /> 
      <capability name="supportsCallback"    value="true" /> 
      <capability name="supportsDivNoWrap"    value="false" /> 
      <capability name="supportsFileUpload"    value="true" /> 
      <capability name="supportsMaintainScrollPositionOnPostback" value="true" /> 
      <capability name="supportsMultilineTextBoxDisplay" value="true" /> 
      <capability name="supportsXmlHttp"     value="true" /> 
      <capability name="tables"       value="true" /> 
     </capabilities> 
    </browser> 
</browsers> 

Następnie ponownie skompilować projekt (i być może ponownie uruchomić serwer jeśli można), a następnie presto, można naśladować cookie uwierzytelniania ASP.NET!

+4

Bzdura przeglądarki w ASP.NET obraża mnie, nie decyduj o rzeczy dla przeglądarki. Powinien on obsługiwać wszystko dokładnie tak, jak jest zakodowane w przeglądarce i pozwolić przeglądarce dławić się, jeśli ta przeglądarka jest zbyt głupia, a ja nie starałem się rozwiązać problemów po stronie klienta przeglądarki. –

+0

Żałuję, że nie mogłem tego zrobić więcej niż raz. Dobra robota. –

2

Wygląda like a bug i wydaje się, że jest fix in the trunk.

+0

Widziałem ten raport o błędzie, ale to od stycznia 2010 i wersji 0.9.0. Od tego czasu było kilka wydań, które zawierały poprawkę, w tym 0.10.0, aktualną wersję. Ponadto wspomniałem, że wyraźnie widzę, że plik cookie jest ustawiony, po prostu nie jest akceptowany przez ASP.NET z jakiegokolwiek powodu. – cdmckay

+0

@cdmckay, czy potwierdziłeś, że bagażnik został załatany? Status mówi * Naprawiono * ale patrząc na problem, który opisujesz tutaj, wygląda on dziwnie blisko tego raportu o błędzie. –

+0

Tak. Próbowałem również na wszelki wypadek obejścia '--custom-header Cookie .ASPX = 91C0DE4C ...'. Taki sam problem. – cdmckay