wkhtmltopdf Log in to asp.net web app
Asked Answered
P

4

8

Having a problem with wkhtmltopdf. I'm using it to take pdf snapshots of pages on a website that has a username/password page. When the .exe runs, I end up with a snapshot of the login page (running the exe from my own ASP.NET app).

Does anybody know how I would get wkhtmltopdf to log into the site so that it can access the page it needs to take a snapshot of?

wkhtmltopdf is installed in the program files directory on the server and is being called via:

public void HtmlToPdf(string website, string destinationFile)
    {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = "wkhtmltopdf.exe";
        startInfo.Arguments = website + " " + destinationFile;
        Process.Start(startInfo);
    }

Thanks! --Dan


THE ANSWER

I couldn't get the --cookie-jar method to work (see comments), but I did find another way to programmatically log in with the username/password in the querystring.

I pass the username/pw as params in my querystring and try to access the page I want with wkhtml. When the membership provider kicks me out to the login page, I access the params (which are stored in the url as the returnUrl param) via code-behind and authenticate myself. A simple response.redirect, and bingo -- I've got my PDF snapshot.

// Check to see if an outside program is trying
// to log in by passing creds in the querystring.
if (Request.QueryString["username"] != null) &&
    Request.QueryString["password"] != null))
{ 
    string user = Request.QueryString["username"];
    string pw   = Request.QueryString["password"];
    if (System.Web.Security.Membership.ValidateUser(user, pw))
    {
        // Create an authentication ticket for wkhtml session
        System.Web.Security.FormsAuthentication.SetAuthCookie(user, false);
        if (Request.QueryString["ReturnUrl"] != null)
        {
            Response.Redirect(Request.QueryString["ReturnUrl"]);
        }
    }
    else 
    {
        throw new Exception("You failed to log in.");
    }
}
Padlock answered 10/1, 2011 at 20:25 Comment(1)
Nice thinking! Possibly not the nicest way to do it, but after hours of searching, it's the best option I've seen!Sible
A
2

First, check the login form what post parameter it uses then try --post username xxx --post password xxx. Alternatively use wireshark and record the login process and see what parameters were posted.

Once u are logged in use --cookie-jar

See a better explanation here http://wkhtmltopdf.org/

getting wkhtmltopdf to convert a protected page can be tricky. Use also --extended-help to see other parameters u can use to login. e.g. if the site is protected by basic authentication it should be fairly easy with --user --password

Apostolate answered 23/2, 2011 at 8:49 Comment(3)
Thanks, Max. Your link got me on the right track. I've posted my solution for the world to see. I would still like to get the coookiejar method working -- it's so much cleaner. Maybe one day I'll revisit and make a youtube video out of it.Padlock
I can't get this to work, I always get a ExitCode = 1, I'm in a MVC application, it works when I don't put [Authorize] attribute but when I try to add "--post userid=XXXX --post pwd=YYY" it fails. Does adding these params make a HttpPost actioon or it still do a Get?Ethnarch
@Ethnarch - I couldn't say. As you can see in my answer, I had to resort to a cheap hack to get it to work.Padlock
Q
2

If anyone's still looking for an answer, I'll write up a brief summary of what I did to get it working.

First, inspect the page you want to log in to, for instance http:/www.example.com/login

Look for the form surrounding the username/password inputs. In my case, I was logging into a rails form, so I also needed the authenticity token. Once you have the name and values of the log in inputs, you can make the first wkhtmltoimage call like this:

wkhtmltoimage --cookie-jar my.jar --post username steve --post password iscool http://www.example.com/login dummy.jpg

In my case of the rails form, I needed to pass the auth_token as a post parameter as well. Then, just re use that cookie jar when accessing the main page you want to view:

wkhtmltoimage --cookie-jar my.jar http://example.com/myprofile screenshot.jpg

Quinquevalent answered 7/3, 2014 at 2:34 Comment(0)
P
0

The other way is to render view of website to html string and save temporarily to a local file. Then use wkhtmltopdf to convert that html file to PDF then remove that local file afterward. This way we do not need to handle the authentication of MVC.

Pearse answered 13/10, 2014 at 16:40 Comment(1)
How would you render the references for CSS and javascript?Catima
N
0

I had a similar issue with my application that works on ASP.Net forms authentication. I had to pass in the authentication cookie like this to get it to work.

--cookie <name> <value>       

Important catch is that no additional cookie must be passed apart from auth cookie. Because some cookies with cause authentication to fail and even if it doesn't it will slow up the wkhtml process because wkhtml will have to process each cookie passed to it

Nikitanikki answered 10/1, 2019 at 19:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.