Эмулировать cookie аутентификации ASP.NET - PullRequest
10 голосов
/ 21 сентября 2011

Я поддерживаю веб-сайт ASP.NET MVC, который использует

FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);

для входа в систему пользователей (в результате они получают cookie с именем .ASPXAUTH).

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

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

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

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

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

Поэтому я изменяю команду так:

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

Гдезначение cookie извлекается с помощью 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

Ответы [ 2 ]

16 голосов
/ 21 сентября 2011

Я нашел проблему.Я заметил, что как только я изменил поле User-Agent (в Fiddler), чтобы оно стало таким же, как в Chrome, оно работало нормально.Поэтому я немного поработал в Интернете и обнаружил эту ошибку на странице проекта wkhtmltopdf .

Из ошибки:

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

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

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

Обновление

Хорошо, я понял, как сообщить 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>

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

2 голосов
/ 21 сентября 2011

Выглядит как ошибка , и кажется, что в стволе исправлено .

...