2011-09-21 41 views
10

tôi duy trì một trang web ASP.NET MVC sử dụngEmulate ASP.NET xác thực Cookie

FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 

ký người dùng trong (họ kết thúc với một cookie được đặt tên .ASPXAUTH).

Khách hàng muốn tôi thêm tính năng HTML sang PDF, vì vậy tôi đang gói thư viện wkhtmltopdf và gọi đó. Điều này kết thúc lên được một lệnh đó trông như thế này:

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

Tuy nhiên, các kết quả trong việc đưa ra một PDF của màn hình đăng nhập, như user agent wkhtmltopdf được chuyển hướng vì nó không có cookie chính xác.

Đó là mỹ từ đó, theo các tài liệu wkhtmltopdf, có một cuộc tranh cãi như thế này:

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

Vì vậy, tôi sửa đổi lệnh là:

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

Trường hợp giá trị cookie được lấy ra sử dụng Request.Cookie[".ASPXAUTH"].Value .

Thật không may, điều này dường như không hoạt động và tôi không biết tại sao. Tôi biết rằng ASP.NET đang nhận được cookie vì khi tôi phá vỡ trang đăng nhập sau khi chuyển hướng, tôi có thể thấy rằng nó đã được thiết lập. Vậy tại sao ASP.NET không chấp nhận cookie đã sao chép của tôi?

Dưới đây là nội dung của một yêu cầu rằng ASP.NET cho phép (từ 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 

Và đây cũng là loại nó chuyển hướng để đăng nhập (từ 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 

Trả lời

16

Tôi đã tìm thấy sự cố. Tôi nhận thấy rằng khi tôi thay đổi trường User-Agent (trong Fiddler) thành giống như Chrome, nó hoạt động tốt. Vì vậy, tôi đã làm một ít web sleuthing và phát hiện this bug on the wkhtmltopdf project page.

Từ lỗi:

Đây là vấn đề thuộc ASP .NET 4.0 như nó có vẻ rằng NET dịch chuỗi User-Agent "Mozilla/5.0 (Windows; U; Windows NT 6.1; en -AU) AppleWebKit/532.4 (KHTML, như Gecko) Qt/4.6.1 Safari/532.4 "không phải là hỗ trợ cookie mà tôi cho rằng đang ngăn tùy chọn --cookie hoạt động trong ASP.

Vì vậy, có vẻ như giải pháp là tìm ra cách để thay đổi wkhtmltopdf là tiêu đề User-Agent (không tìm kiếm đầy đủ) hoặc tìm ra cách để cho ASP.NET biết rằng tác nhân người dùng đó hỗ trợ cookie.

Cảm ơn bạn đã giúp Darin Dimitrov.

Cập nhật

Ok, tôi đã tìm ra cách để nói với ASP.NET rằng trình duyệt web Qt được sử dụng bởi wkhtmltopdf hỗ trợ cookie. Bạn cần phải tạo một tập tin gọi là qt.browser và lưu nó vào một thư mục callde App_Browsers trong thư mục gốc của dự án ASP.NET của bạn. Đây là những gì bạn đặt trong file 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> 

Sau đó lập lại dự án của bạn (và có thể khởi động lại máy chủ của bạn nếu bạn có thể) và sau đó mau, bạn có thể bắt chước cookie ASP.NET xác thực!

+4

Crap trình duyệt trong ASP.NET làm tôi khó chịu, không quyết định nội dung cho trình duyệt. Nó sẽ phục vụ mọi thứ chính xác như được mã hóa cho trình duyệt và để cho trình duyệt nghẹt thở nếu trình duyệt đó quá ngu ngốc, và tôi đã không dành công sức để khắc phục sự cố ở phía trình duyệt của khách hàng. –

+0

Tôi ước rằng tôi có thể upvote điều này nhiều hơn một lần. Làm tốt. –

2

Trông like a bug và có vẻ như là fix in the trunk.

+0

Tôi đã thấy báo cáo lỗi đó nhưng đó là từ tháng 1 năm 2010 và cho phiên bản 0.9.0. Đã có một số bản phát hành kể từ đó đã có bản sửa lỗi, bao gồm 0.10.0, phiên bản hiện tại. Hơn nữa, tôi đã đề cập rằng tôi có thể thấy rõ ràng cookie được thiết lập, nó chỉ không được chấp nhận bởi ASP.NET vì lý do gì. – cdmckay

+0

@cdmckay, bạn đã xác minh rằng thân cây đã được vá chưa? Tình trạng nói * Cố định * nhưng nhìn vào vấn đề bạn đang mô tả ở đây nó trông kỳ lạ gần với báo cáo lỗi này. –

+0

Có. Tôi cũng đã thử '--custom-header Cookie .ASPX = 91C0DE4C ...' giải pháp chỉ trong trường hợp. Cùng một vấn đề. – cdmckay

Các vấn đề liên quan