【问题标题】:Emulate ASP.NET authentication cookie模拟 ASP.NET 身份验证 cookie
【发布时间】:2011-11-21 15:45:15
【问题描述】:

我维护一个使用 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

【问题讨论】:

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


    【解决方案1】:

    我发现了问题。我注意到,一旦我将 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, like Gecko) Qt/4.6.1 Safari/532.4" as not 支持我认为阻止 --cookie 选项的 cookie 在 ASP 下工作。

    因此,看起来解决方案要么想办法让 wkhtmltopdf 更改它的 User-Agent 标头(看起来没有希望),要么想办法告诉 ASP.NET 该用户代理确实支持 cookie。

    感谢您帮助达林·迪米特洛夫。

    更新

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

    【讨论】:

    • ASP.NET 中的浏览器垃圾让我感到恶心,不要为浏览器决定东西。它应该完全按照浏览器的编码提供所有内容,如果浏览器太愚蠢,让浏览器窒息,而且我还没有花精力解决浏览器客户端的问题。
    【解决方案2】:

    看起来like a bug,似乎有一个fix in the trunk

    【讨论】:

    • 我看到了那个错误报告,但那是从 2010 年 1 月开始的,适用于 0.9.0 版。从那时起,已经有多个版本包含该修复程序,包括当前版本 0.10.0。此外,我提到我可以清楚地看到正在设置的 cookie,它只是不被 ASP.NET 接受,无论出于何种原因。
    • @cdmckay,你确认主干被修补了吗?状态显示为 Fixed,但看看您在此处描述的问题,它看起来与此错误报告非常接近。
    • 是的。为了以防万一,我还尝试了--custom-header Cookie .ASPX=91C0DE4C... 解决方法。同样的问题。
    • 我认为 ASP.NET 会检查更多内容,但我不确定它是什么。
    • @cdmckay,不,没有。 cookie 是 ASP.NET 的表单身份验证模块默认检查的唯一内容。当然,如果您在其顶部添加了额外的检查,那是另一回事。尝试使用 Fiddler 查看网络上发送的内容并查看是否正在发送 cookie。另一种可能性是暂时禁用此操作的身份验证并在其中放置一个断点并检查 Request.Cookies 以查看 Auth cookie 是否存在。如果不是,那就有问题了。
    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2014-04-01
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多