2011-09-21 5 views
10

Я поддерживать веб-сайт ASP.NET MVC, который используетЭмуляция ASP.NET аутентификации печенье

FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 

подписать пользователей в (они в конечном итоге с куки с именем .ASPXAUTH).

Клиент хочет, чтобы я добавил функцию HTML в PDF, поэтому я обертываю библиотеку wkhtmltopdf и звоню. Это заканчивает тем, что команда, которая выглядит следующим образом:

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

Однако, что приводит сделать PDF на экране входа в систему, так как агент пользователя wkhtmltopdf перенаправлен, так как он не имеет правильного печенья.

Это нормально, так как, в соответствии с документацией wkhtmltopdf, есть аргумент, как это:

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

Так что я изменить команду, чтобы быть:

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

Если значение куки извлекается с помощью Request.Cookie[".ASPXAUTH"].Value ,

К сожалению, это не работает, и я понятия не имею, почему. Я знаю, что ASP.NET получает файл cookie, потому что, когда я перехватываю страницу входа после перенаправления, я вижу, что она была установлена. Итак, почему ASP.NET не принимает мой скопированный файл cookie?

Вот содержание запроса, что позволяет ASP.NET (от 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 

И вот один, что он перенаправляет на входе (от 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 

ответ

16

Я нашел проблему. Я заметил, что как только я изменил поле User-Agent (в Fiddler), чтобы он был таким же, как Chrome, он работал нормально. Так что я сделал небольшую паутину и обнаружил this bug on the wkhtmltopdf project page.

От ошибки:

Это является проблемой при ASP .NET 4.0, как это кажется, что .NET интерпретирует строку User-Agent «Mozilla/5.0 (Windows; U; Windows NT 6.1; ан -AU) AppleWebKit/532.4 (KHTML, как Gecko) Qt/4.6.1 Safari/532.4 "as not поддержка файлов cookie, которые, как я думаю, предотвращают использование опции -cookie 0cот работы под ASP.

Так это выглядит как решение либо выяснить способ сделать wkhtmltopdf изменить его User-Agent заголовок (не смотря на многообещающий) или выяснить способ сказать ASP.NET, что этот агент пользователя делает поддержку куки.

Спасибо вам за помощь Дарин Димитров.

Update

Хорошо, я понял, как сказать ASP.NET, что веб-браузер Qt, используемый wkhtmltopdf, поддерживает файлы cookie. Вам нужно создать файл с именем qt.browser и сохранить его в каталоге callde App_Browsers в корне вашего проекта ASP.NET. Вот что вы вкладываете в файле 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> 

Затем повторно скомпилировать проект (и, возможно, перезагрузите сервер, если вы можете), а затем вуаля, вы можете эмулировать куки аутентификации ASP.NET!

+4

Браузер дерьма в ASP.NET меня раздражает, не решайте вещи для браузера. Он должен обслуживать все точно так же, как закодирован в браузере, и пусть браузер задыхается, если этот браузер слишком глуп, и я не потратил усилий на устранение проблем на стороне клиента браузера. –

+0

Мне жаль, что я не смог бы продвигать это более одного раза. Отлично сработано. –

2

Выглядит like a bug и, кажется, fix in the trunk.

+0

Я видел этот отчет об ошибке, но это с января 2010 года и для версии 0.9.0. С тех пор было несколько релизов, в которых было исправлено, включая 0.10.0, текущую версию. Кроме того, я упомянул, что я могу ясно видеть, что cookie установлен, это просто не принимается ASP.NET по какой-либо причине. – cdmckay

+0

@cdmckay, вы подтвердили, что багажник был исправлен? Статус говорит * Исправлено *, но, глядя на проблему, которую вы описываете здесь, она выглядит странно близкой к этому отчету об ошибке. –

+0

Да. Я также попытался использовать «-custom-header Cookie .ASPX = 91C0DE4C ...» на всякий случай. Та же проблема. – cdmckay

Смежные вопросы