IRONSOFTWAREHOME

Convert HTML to PDF Behind Login Authentication in C#

Curtis Chau
Curtis Chau
Updated: September 5, 2026

To convert HTML to PDF behind login authentication in C#, use IronPDF's ChromeHttpLoginCredentials for network authentication or download HTML using System.Net.WebClient/HttpClient before conversion. This approach handles both network authentication and HTML form logins effectively.

Quickstart: Convert HTML to PDF Behind Login with IronPDF

Convert HTML pages to PDFs behind login forms using IronPDF's API. This guide demonstrates ChromeHttpLoginCredentials for authentication and protected content retrieval. Handle both network authentication and HTML form logins with straightforward code examples.

  1. 1Install IronPDF with NuGet Package Manager

    PM > Install-Package IronPdf

  2. 2Copy and run this code snippet.

    new ChromePdfRenderer { LoginCredentials = new ChromeHttpLoginCredentials { NetworkUsername = "username", NetworkPassword = "password" } }
        .RenderUrlAsPdf("https://example.com/protected")
        .SaveAs("secure.pdf");
    C#
  3. 3Deploy to test on your live environment

    Start using IronPDF in your project today with a free trial
    arrow pointer

What Are the Best Practices for Handling Login Authentication?

IronPDF supports TLS network authentication (username and password) through the ChromeHttpLoginCredentials API. For comprehensive guidance on various login scenarios, see the TLS Website & System Logins tutorial.

The recommended approach is using System.Net.WebClient or HttpClient to download HTML and assets. This method supports headers, logins, and other requirements. After downloading to memory or disk, IronPDF converts the HTML to PDF. Extract assets like stylesheets and images using HtmlAgilityPack, then download with System.Net.WebClient.

// Your authentication token
string accessToken = "your-access-token";

// Download HTML content from a URL with authentication
using (WebClient client = new WebClient())
{
    // Add authentication headers if needed
    client.Headers.Add("Authorization", "Bearer " + accessToken);

    // Download the HTML string
    string html = client.DownloadString("http://www.example.com/protected-content");

    // Load the HTML into an HtmlDocument for parsing
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);

    // Extract all image sources for downloading
    foreach(HtmlNode img in doc.DocumentNode.SelectNodes("//img"))
    {
        string imgSrc = img.GetAttributeValue("src", null);
        Console.WriteLine($"Found image: {imgSrc}");

        // Download each image asset
        if (!string.IsNullOrEmpty(imgSrc))
        {
            string fileName = Path.GetFileName(imgSrc);
            client.DownloadFile(imgSrc, fileName);
        }
    }

    // Convert the downloaded HTML to PDF
    var renderer = new ChromePdfRenderer();
    var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs("authenticated-content.pdf");
}
C#
Please note: Rebase relative URLs to absolute URLs using the overloaded System.Uri constructor. To rebase all relative paths in an HTML document, add a <base> tag to the header using HtmlAgilityPack. Example. For more information on handling URLs and assets, see the Base URLs & Asset Encoding guide.

Why Should I Download HTML Content First?

Downloading HTML content before conversion provides several advantages:

  1. Complete Control: Modify HTML, fix broken links, or inject authentication tokens before conversion
  2. Asset Management: Download and cache external resources like images, CSS, and JavaScript files
  3. Authentication Flexibility: Use any .NET authentication mechanism including OAuth, JWT tokens, or custom headers
  4. Performance: Cache frequently accessed content to reduce server load
  5. Debugging: Inspect the exact HTML being converted to troubleshoot issues

For complex authentication scenarios involving cookies and sessions, see the Cookies guide which explains authentication state management during PDF conversion.

How Do I Handle Assets Like Images and Stylesheets?

When converting authenticated pages, external assets often require the same authentication. Here's a comprehensive approach using HttpClient:

public async Task<string> DownloadAuthenticatedHtmlWithAssets(string url, string authToken)
{
    using (var client = new HttpClient())
    {
        // Set authentication header
        client.DefaultRequestHeaders.Authorization = 
            new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authToken);
        
        // Download the main HTML
        string html = await client.GetStringAsync(url);
        
        // Parse HTML to find assets
        var doc = new HtmlDocument();
        doc.LoadHtml(html);
        
        // Create a base URI for resolving relative paths
        var baseUri = new Uri(url);
        
        // Download CSS files
        var cssLinks = doc.DocumentNode.SelectNodes("//link[@rel='stylesheet']");
        if (cssLinks != null)
        {
            foreach (var link in cssLinks)
            {
                string href = link.GetAttributeValue("href", "");
                if (!string.IsNullOrEmpty(href))
                {
                    var cssUri = new Uri(baseUri, href);
                    string cssContent = await client.GetStringAsync(cssUri);
                    
                    // Embed CSS directly in the HTML
                    var styleNode = doc.CreateElement("style");
                    styleNode.InnerHtml = cssContent;
                    doc.DocumentNode.SelectSingleNode("//head").AppendChild(styleNode);
                    
                    // Remove the external link
                    link.Remove();
                }
            }
        }
        
        // Return the modified HTML with embedded assets
        return doc.DocumentNode.OuterHtml;
    }
}

What Tools Help with HTML Parsing?

The HtmlAgilityPack is the most popular HTML parsing library for .NET, but alternatives exist:

  1. HtmlAgilityPack: Best for general HTML parsing and manipulation
  2. AngleSharp: Modern, standards-compliant HTML parser with CSS selector support
  3. CsQuery: jQuery-like syntax for C# developers familiar with jQuery
  4. Regular Expressions: For simple extraction tasks (not recommended for complex HTML)

ChromeHttpLoginCredentials

How Do I Login Using Network Authentication?

Most ASP.NET applications support network authentication, which is more reliable than HTML form posting. IronPDF provides built-in support for basic, digest, and NTLM authentication through the ChromeHttpLoginCredentials class. For additional header customization, see the HTTP Request Header guide.

using IronPdf;
using System;

ChromePdfRenderer renderer = new ChromePdfRenderer
{
    // setting login credentials to bypass basic authentication
    LoginCredentials = new ChromeHttpLoginCredentials()
    {
        NetworkUsername = "testUser",
        NetworkPassword = "testPassword"
    }
};

var uri = new Uri("http://localhost:51169/Invoice");

// Render web URL to PDF
PdfDocument pdf = renderer.RenderUrlAsPdf(uri);

// Export PDF
pdf.SaveAs("UrlToPdfExample.Pdf");

Why Is Network Authentication More Reliable Than Form Posting?

Network authentication offers several advantages over HTML form posting:

  1. Standardized Protocol: Uses HTTP authentication headers following RFC standards
  2. Browser Integration: Chrome rendering engine handles authentication
  3. Session Management: Automatic handling of authentication challenges and session persistence
  4. Security: Credentials transmitted securely via headers rather than form data
  5. Compatibility: Works with most enterprise authentication systems (Active Directory, LDAP)

What Credentials Do I Need for Network Authentication?

Different authentication types require different credentials:

// Basic Authentication (most common)
var basicAuth = new ChromeHttpLoginCredentials
{
    NetworkUsername = "user@domain.com",
    NetworkPassword = "password123"
};

// NTLM/Windows Authentication
var ntlmAuth = new ChromeHttpLoginCredentials
{
    NetworkUsername = "DOMAIN\\username", // Include domain
    NetworkPassword = "password123"
};

// Custom authentication headers
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HttpRequestHeaders = new Dictionary<string, string>
{
    { "X-API-Key", "your-api-key" },
    { "Authorization", "Bearer " + jwtToken }
};
C#

How Do I Troubleshoot Authentication Failures?

Common authentication issues and solutions:

  1. 401 Unauthorized: Check credentials and authentication type
  2. 403 Forbidden: User authenticated but lacks permissions
  3. Timeout Errors: Increase Timeout for slow authentication systems
  4. Certificate Errors: Configure TLS/SSL settings appropriately

Enable debugging to diagnose issues:

// Enable detailed logging
IronPdf.Logging.Logger.EnableDebugging = true;
IronPdf.Logging.Logger.LogFilePath = "IronPdf.log";
IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All;

// Test authentication
try 
{
    var pdf = renderer.RenderUrlAsPdf("https://secure.example.com");
    pdf.SaveAs("authenticated.pdf");
}
catch (Exception ex)
{
    Console.WriteLine($"Authentication failed: {ex.Message}");
    // Check IronPdf.log for detailed error information
}

My favorite library of this kind is IronPDF. It allows for fast and efficient manipulation of PDF files. It also has many valuable features, like exporting to PDF/A format and digitally signing PDF documents.

Milan Jovanovic

Microsoft MVP

View case study

IronOCR means we can save $40,000 annually from manual processing, while enhancing productivity and freeing up resources for high-impact tasks. I would highly recommend it.

Brent Matzelle

Chief Technology Officer, OPYN

View case study

The IronSuite play a crucial role in our operations. These are tools that increase efficiencies across the business including creating floor plans and improving inventory management.

David Jones

Lead Software Engineer, Agorus Build

View case study

How Do I Login Using an HTML Form?

To log in by sending data to an HTML form, use the ChromeHttpLoginCredentials class. See IronPDF's ChromeHttpLoginCredentials API.

Consider these points:

  • Post login data to the URL specified in the HTML form's ACTION attribute. Set this as the LoginFormUrl attribute of HttpLoginCredentials. This may differ from the URL you want to render as a PDF.
  • Send data representing every input and textarea in the HTML form. The name attributes define each variable name (not the id).
  • Some websites actively protect against machine login.
// Configure form-based login
var formLogin = new ChromeHttpLoginCredentials
{
    LoginFormUrl = "https://example.com/login",
    LoginFormData = new Dictionary<string, string>
    {
        {"username", "user@example.com"},
        {"password", "securePassword123"},
        {"rememberMe", "true"},
        {"csrf_token", "abc123"} // Include any hidden fields
    }
};

var renderer = new ChromePdfRenderer
{
    LoginCredentials = formLogin,
    RenderingOptions = new ChromePdfRenderOptions
    {
        RenderDelay = 3000, // Allow time for login redirect
        EnableJavaScript = true
    }
};

// The actual page you want to convert (after login)
var pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard");
pdf.SaveAs("dashboard.pdf");

What Form Data Do I Need to Capture?

To authenticate successfully via HTML forms, capture all form inputs:

// Use this helper method to extract form fields
public Dictionary<string, string> ExtractFormFields(string loginPageHtml)
{
    var formData = new Dictionary<string, string>();
    var doc = new HtmlDocument();
    doc.LoadHtml(loginPageHtml);
    
    // Find all input fields
    var inputs = doc.DocumentNode.SelectNodes("//input");
    if (inputs != null)
    {
        foreach (var input in inputs)
        {
            string name = input.GetAttributeValue("name", "");
            string value = input.GetAttributeValue("value", "");
            string type = input.GetAttributeValue("type", "text");
            
            if (!string.IsNullOrEmpty(name))
            {
                // Handle different input types
                switch (type.ToLower())
                {
                    case "checkbox":
                        if (input.Attributes["checked"] != null)
                            formData[name] = "on";
                        break;
                    case "radio":
                        if (input.Attributes["checked"] != null)
                            formData[name] = value;
                        break;
                    default:
                        formData[name] = value;
                        break;
                }
            }
        }
    }
    
    // Don't forget select elements
    var selects = doc.DocumentNode.SelectNodes("//select");
    if (selects != null)
    {
        foreach (var select in selects)
        {
            string name = select.GetAttributeValue("name", "");
            var selected = select.SelectSingleNode(".//option[@selected]");
            if (selected != null && !string.IsNullOrEmpty(name))
            {
                formData[name] = selected.GetAttributeValue("value", "");
            }
        }
    }
    
    return formData;
}

How Do I Find the Correct Form Action URL?

The form action URL is critical for successful authentication:

public string ExtractFormAction(string loginPageUrl, string loginPageHtml)
{
    var doc = new HtmlDocument();
    doc.LoadHtml(loginPageHtml);
    
    // Find the login form
    var form = doc.DocumentNode.SelectSingleNode("//form[contains(@action, 'login') or contains(@id, 'login') or contains(@class, 'login')]");
    
    if (form == null)
    {
        // Try finding any form with password field
        form = doc.DocumentNode.SelectSingleNode("//form[.//input[@type='password']]");
    }
    
    if (form != null)
    {
        string action = form.GetAttributeValue("action", "");
        
        // Resolve relative URLs
        if (!string.IsNullOrEmpty(action))
        {
            var baseUri = new Uri(loginPageUrl);
            var actionUri = new Uri(baseUri, action);
            return actionUri.ToString();
        }
    }
    
    // Default to the login page URL if no action found
    return loginPageUrl;
}

What Are Common Issues with Form-Based Authentication?

  1. CSRF Tokens: Many forms include anti-forgery tokens that expire
  2. JavaScript Validation: Some forms require JavaScript execution
  3. Multi-Step Authentication: Forms that require multiple pages
  4. CAPTCHA Protection: Human verification challenges
  5. Session Timeouts: Login sessions that expire quickly

ViewBag TempData Html

For comprehensive HTML to PDF conversion guidance, including complex authentication scenarios, visit the HTML to PDF tutorial.

How Do I Handle MVC Authentication?

The following workaround renders a .NET MVC view to a string programmatically, avoiding MVC logins while rendering views faithfully. This approach works well when converting CSHTML to PDF in MVC Core or MVC Framework.

// Converts an MVC partial view to a string
public static string RenderPartialViewToString(this Controller controller, string viewPath, object model = null)
{
    try
    {
        // Set the model
        var context = controller.ControllerContext;
        controller.ViewData.Model = model;

        using (var sw = new StringWriter())
        {
            // Find the partial view
            var viewResult = ViewEngines.Engines.FindPartialView(context, viewPath);

            if (viewResult.View == null)
            {
                throw new Exception($"Partial view {viewPath} could not be found.");
            }

            // Create a view context
            var viewContext = new ViewContext(context, viewResult.View, context.Controller.ViewData, context.Controller.TempData, sw);

            // Render the view
            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(context, viewResult.View);

            return sw.GetStringBuilder().ToString();
        }
    }
    catch (Exception ex)
    {
        // Return error message if there is an exception
        return ex.Message;
    }
}

// Usage in an MVC Controller
public ActionResult GeneratePdf()
{
    // Render authenticated view to string
    var model = new InvoiceViewModel { /* populate model */ };
    string html = this.RenderPartialViewToString("~/Views/Invoice/Details.cshtml", model);
    
    // Convert to PDF
    var renderer = new ChromePdfRenderer();
    var pdf = renderer.RenderHtmlAsPdf(html);
    
    // Return PDF file
    return File(pdf.BinaryData, "application/pdf", "invoice.pdf");
}

Why Render Views to String Instead of Direct Conversion?

Rendering MVC views to string provides several key advantages:

  1. Authentication Context: Views render within the authenticated user's context
  2. Full MVC Pipeline: All MVC features work including HtmlHelper, UrlHelper, and ViewBag helpers
  3. Layout Support: Master pages and layouts render correctly
  4. Model Binding: Complex view models work
  5. Action Filters: Security and logging filters execute normally

What Are the Benefits of This MVC Workaround?

The MVC string rendering approach offers:

  • Security: No need to expose internal URLs or bypass authentication
  • Performance: Avoid additional HTTP requests
  • Consistency: Identical output to what users see in browsers
  • Flexibility: Modify HTML before PDF conversion
  • Testing: Unit test HTML generation easily

How Do I Pass Models to the Rendered View?

Here's a comprehensive example with a complex model:

public class InvoiceController : Controller
{
    private readonly IInvoiceService _invoiceService;
    
    public async Task<ActionResult> DownloadInvoicePdf(int invoiceId)
    {
        // Load data within authenticated context
        var invoice = await _invoiceService.GetInvoiceAsync(invoiceId);
        
        if (invoice == null || invoice.UserId != User.Identity.GetUserId())
        {
            return HttpNotFound();
        }
        
        // Create view model
        var viewModel = new InvoiceDetailsViewModel
        {
            Invoice = invoice,
            Company = await _invoiceService.GetCompanyDetailsAsync(),
            LineItems = await _invoiceService.GetLineItemsAsync(invoiceId),
            TaxDetails = await _invoiceService.GetTaxDetailsAsync(invoiceId)
        };
        
        // Render to HTML string
        string html = this.RenderPartialViewToString("~/Views/Invoice/DetailsPdf.cshtml", viewModel);
        
        // Add custom styling for PDF
        html = $@"
            <html>
            <head>
                <style>
                    body {{ font-family: Arial, sans-serif; }}
                    .invoice-header {{ background-color: #f0f0f0; padding: 20px; }}
                    .line-items {{ width: 100%; border-collapse: collapse; }}
                    .line-items th, .line-items td {{ border: 1px solid #ddd; padding: 8px; }}
                </style>
            </head>
            <body>
                {html}
            </body>
            </html>";
        
        // Convert to PDF with options
        var renderer = new ChromePdfRenderer
        {
            RenderingOptions = new ChromePdfRenderOptions
            {
                MarginTop = 20,
                MarginBottom = 20,
                MarginLeft = 10,
                MarginRight = 10,
                PrintHtmlBackgrounds = true
            }
        };
        
        var pdf = renderer.RenderHtmlAsPdf(html);
        
        // Add metadata
        pdf.MetaData.Author = "Invoice System";
        pdf.MetaData.Title = $"Invoice #{invoice.Number}";
        pdf.MetaData.CreationDate = DateTime.Now;
        
        return File(pdf.BinaryData, "application/pdf", $"Invoice-{invoice.Number}.pdf");
    }
}

Before implementing any authentication solution, ensure you have installed IronPDF properly and configured your license keys.

Ready to see what else you can do? Visit our tutorial page: Convert PDFs. RenderDelay

Frequently Asked Questions

How can I convert HTML to PDF behind login authentication using C#?

You can use IronPDF's 'ChromeHttpLoginCredentials' class for network authentication or download the HTML using System.Net.WebClient or HttpClient before conversion. This handles both network and HTML form logins effectively.

What is the purpose of the 'ChromeHttpLoginCredentials' class in IronPDF?

The 'ChromeHttpLoginCredentials' class in IronPDF is used for network authentication, supporting various authentication types such as basic, digest, and NTLM. It helps bypass authentication for accessing protected HTML content.

Why should I download HTML content before converting it to PDF?

Downloading HTML content beforehand provides control over the HTML, allows asset management, enhances authentication flexibility, improves performance through caching, and aids in debugging by letting you inspect the HTML.

How does IronPDF handle assets like images and stylesheets during PDF conversion?

IronPDF can handle assets by leveraging HttpClient to download them. You can parse HTML with HtmlAgilityPack, resolve relative paths to absolute URLs, and embed CSS directly to ensure all resources are included in the PDF.

What are the benefits of using network authentication over form posting?

Network authentication uses standardized HTTP headers, is generally more secure, integrates well with browsers, manages sessions automatically, and is compatible with enterprise systems such as Active Directory.

What tools are recommended for parsing HTML in C#?

HtmlAgilityPack is popular for HTML parsing and manipulation in .NET. Alternatives include AngleSharp for modern HTML parsing, CsQuery for jQuery-like syntax, and regular expressions for simple extractions, though not recommended for complex tasks.

How do I log in using HTML form authentication with IronPDF?

Using IronPDF, you can configure form-based login by providing URL and form data to 'ChromeHttpLoginCredentials'. Ensure all input data from the HTML form, including hidden fields like CSRF tokens, are captured accurately.

What common issues might arise with form-based authentication?

Common issues include handling CSRF tokens, JavaScript validations, multi-step processes, CAPTCHA requirements, and session timeouts. Properly addressing these can ensure smoother login processes for automated tasks.

How can I troubleshoot authentication failures with IronPDF?

Authentication issues can be addressed by verifying credentials, checking for 401 or 403 errors, adjusting timeout settings, ensuring proper TLS/SSL configuration, and enabling detailed logging to diagnose problems.

What are the advantages of rendering MVC views to strings before converting to PDF?

Rendering views to strings maintains the authentication context, supports MVC features, and allows modification of HTML before conversion. This approach ensures security, performance, and consistency, reflecting what users see in browsers.

Curtis Chau
Technical Writer

Curtis Chau holds a Bachelor’s degree in Computer Science (Carleton University) and specializes in front-end development with expertise in Node.js, TypeScript, JavaScript, and React. Passionate about crafting intuitive and aesthetically pleasing user interfaces, Curtis enjoys working with modern frameworks and creating well-structured, visually appealing manuals.

...
Read More

Ready to Get Started?

Nuget Downloads 21,105,021Version:2026.9just released

Get your FREE

30-day Trial Key instantly.

bullet_checkedNo credit card or account creation required
bullet_testTest in production
without watermarks
bullet_calendar30 days fully
functional product
bullet_support24/5 technical
support during trial
Get your free 30-day Trial Key instantly.
No credit card or account creation required
C# NuGet Library for PDF
Install with NuGet

Version: 2026.9

PM > Install-Package IronPdf
nuget.org/packages/IronPdf/
  1. In Solution Explorer, right-click References, Manage NuGet Packages
  2. Select Browse and search "IronPdf"
  3. Select the package and install
C# PDF DLL
Download DLL

Version: 2026.9

or download Windows Installer here.

  1. Download and unzip IronPDF to a location such as ~/Libs within your Solution directory
  2. In Visual Studio Solution Explorer, right click References. Select Browse, "IronPdf.dll"

Licenses from $999

Key in blue circle

Get your free 30-day Trial Key instantly.

Your trial license will be sent to your email address

No limitations. 100% unlocked. No credit card.

OR
bullet_checkedNo credit card or account creation requiredNo limitations. 100% unlocked. No credit card.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried Iron Suite
Book your free Live Demo
Booking Badge

Trusted by Millions of Engineers Worldwide

Iron Software's customer logos
Get Your No-Obligation Consult
Complete the form below or email sales@ironsoftware.com
Your details will always be kept confidential.
Trusted by Millions of Engineers Worldwide
Iron Software's customer logos
Get your free 30-day Trial Key instantly.
No credit card or account creation required
C# NuGet Library for PDF
Install with NuGet

Version: 2026.9

PM > Install-Package IronPdf
nuget.org/packages/IronPdf/
  1. In Solution Explorer, right-click References, Manage NuGet Packages
  2. Select Browse and search "IronPdf"
  3. Select the package and install
C# PDF DLL
Download DLL

Version: 2026.9

or download Windows Installer here.

  1. Download and unzip IronPDF to a location such as ~/Libs within your Solution directory
  2. In Visual Studio Solution Explorer, right click References. Select Browse, "IronPdf.dll"

Licenses from $999