模拟ASP.NET身份验证cookie

时间:2011-09-21 06:08:35

标签: c# asp.net asp.net-mvc cookies wkhtmltopdf

我维护一个使用

的ASP.NET MVC网站
FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);

对用户进行签名(他们最终得到一个名为.ASPXAUTH的Cookie。)

客户希望我添加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

使用Request.Cookie[".ASPXAUTH"].Value检索Cookie值的位置。

不幸的是,这似乎不起作用,我不明白为什么。我知道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 个答案:

答案 0 :(得分:16)

我发现了问题。我注意到,一旦我将User-Agent字段(在Fiddler中)更改为与Chrome相同,它就可以正常工作。所以我做了一些网络调查并发现了this bug on the wkhtmltopdf project page

从错误:

  

这是ASP .NET 4.0下的一个问题,因为它似乎解释了.NET   用户代理字符串“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。 / p>

感谢你帮助Darin Dimitrov。

<强>更新

好的,我想出了如何告诉ASP.NET wkhtmltopdf使用的Qt Web浏览器支持cookie。您需要创建一个名为qt.browser的文件,并将其保存在ASP.NET项目根目录中的callde App_Browsers目录中。以下是您在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>

然后重新编译您的项目(如果可以的话,可能重新启动服务器)然后presto,您可以模拟ASP.NET身份验证cookie!

答案 1 :(得分:2)

查看like a bug,似乎有fix in the trunk