C# 模拟ASP.NET身份验证cookie

C# 模拟ASP.NET身份验证cookie,c#,asp.net,asp.net-mvc,cookies,wkhtmltopdf,C#,Asp.net,Asp.net Mvc,Cookies,Wkhtmltopdf,我维护一个ASP.NET MVC网站,该网站使用 FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 用户登录(最终会得到一个名为.ASPXAUTH)的cookie) 客户希望我添加一个HTML到PDF功能,所以我正在包装库并调用它。这是一个如下所示的命令: wkhtmltopdf http://example.com/Foo/Edit/42 Foo.pdf --cookie <name> &l

我维护一个ASP.NET MVC网站,该网站使用

FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
用户登录(最终会得到一个名为
.ASPXAUTH
)的cookie)

客户希望我添加一个HTML到PDF功能,所以我正在包装库并调用它。这是一个如下所示的命令:

wkhtmltopdf http://example.com/Foo/Edit/42 Foo.pdf
--cookie <name> <value>         Set an additional cookie (repeatable)
但是,这会导致生成登录屏幕的PDF,因为wkhtmltopdf用户代理由于没有正确的cookie而被重定向

这很好,因为根据wkhtmltopdf文档,有这样一个论点:

wkhtmltopdf http://example.com/Foo/Edit/42 Foo.pdf
--cookie <name> <value>         Set an additional cookie (repeatable)
其中,使用
Request.cookie[“.ASPXAUTH”].value
检索cookie值

不幸的是,这似乎不起作用,我不知道为什么。我知道ASP.NET正在接收cookie,因为当我在重定向后中断登录页面时,我可以看到它已被设置。那么为什么ASP.NET不接受我复制的cookie呢

以下是ASP.NET允许的请求内容(来自Chrome):

下面是它重定向到登录的一个(来自wkhtmltopdf):


看起来好像有一个

我发现了问题。我注意到,一旦我将
用户代理
字段(在Fiddler中)更改为与Chrome相同,它就工作得很好。所以我做了一点网络调查,发现了

从错误中:

这是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“不适用 支持cookies,我认为这会阻止--cookie选项 在ASP下工作

因此,看起来解决方案要么想办法让wkhtmltopdf更改其
用户代理
标题(看起来不太可能),要么想办法告诉ASP.NET该用户代理确实支持cookies

谢谢你帮助达林·迪米特洛夫

更新

好的,我知道了如何告诉ASP.NET wkhtmltopdf使用的Qt web浏览器支持cookies。您需要创建一个名为
qt.browser
的文件,并将其保存在ASP.NET项目根目录中的callde
App\u 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报告,但那是从2010年1月开始的,版本是0.9.0。自那以后,已经有几个版本包含了该修复程序,包括当前版本0.10.0。此外,我提到我可以清楚地看到cookie被设置,只是ASP.NET出于任何原因都不接受它。@cdmckay,您是否验证了主干已被修补?状态为“已修复”,但从您在此处描述的问题来看,它与此错误报告非常接近。是的。为了以防万一,我还尝试了
--customheadercookie.ASPX=91C0DE4C…
变通方法。同样的问题。我认为ASP.NET还需要检查一些东西,但我不确定它是什么。@cdmckay,不,没有。默认情况下,cookie是ASP.NET的Forms Authentication模块检查的唯一内容。当然,如果你在上面添加了额外的检查,那是另一回事。试着使用Fiddler查看在线路上发送的内容,并查看cookie是否正在发送。另一种可能是暂时禁用此操作的身份验证,并在其中放置一个断点,然后检查Request.Cookies以查看是否存在身份验证cookie。如果不是,那就有问题了。ASP.NET中的浏览器垃圾让我恶心,不要决定浏览器的内容。它应该完全按照编码到浏览器的方式提供所有服务,如果浏览器太愚蠢,那么就让浏览器阻塞它,而且我还没有花精力在浏览器客户端解决问题。
<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>