模仿ASP.. NET身份验证cookie
本文关键字:cookie 身份验证 NET ASP 模仿 | 更新日期: 2023-09-27 18:09:06
我维护一个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
我找到问题了。我注意到,一旦我改变了User-Agent
字段(在小提琴手)是相同的Chrome,它工作得很好。所以我做了一点网络侦查,在wkhtmltopdf项目页面上发现了这个bug。
从错误:
这是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选项
所以它看起来像解决方案是找出一种方法来使wkhtmltopdf改变它的User-Agent
头(不看起来有希望)或找出一种方法来告诉ASP。. NET用户代理是否支持cookie
谢谢你的帮助,Darin Dimitrov。
好的,我知道如何告诉ASP。wkhtmltopdf使用的Qt web浏览器支持cookie。您需要创建一个名为qt.browser
的文件,并将其保存在ASP根目录下名为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>
然后重新编译你的项目(也许重启你的服务器,如果你可以的话),然后,你可以模拟ASP。. NET认证cookie!
看起来像一个bug,似乎在主干中有一个修复。