1

我正在尝试从需要身份验证的页面打印出 pdf 发票 ( https://localhost:44362/invoice)。当授权关闭时,所有这些都可以很好地工作,但是当我打开它时,整个事情就崩溃了。我正在使用带有身份验证的 .NET Core 2.1 MVC。我尝试了两种不同的解决方案,它们都以不同的方式失败。

尝试1:
渲染成功,但是登录失败,生成的pdf就是登录页面。据我了解,这是身份验证失败时的正常行为。

var uri = new Uri("https://localhost:44362/invoice");
var newPdf = new HtmlToPdf()
{
    PrintOptions = new PdfPrintOptions()
    {
        //..omitted for brevity
    },
    LoginCredentials = new HttpLoginCredentials()
    {
        EnableCookies = true,
        LoginFormPostVariables = new Dictionary<string, string>()
        {
            { "Email", "username@domain.com" },
            { "Password", "secretysecret" }
        },
        LoginFormUrl = new Uri("https://localhost:44362/login")
    }
};
var result = newPdf.RenderUrlAsPdf(uri);

尝试 2:
我从原始请求中获取授权 cookie。这行得通,至少到目前为止,我实际上可以获取 cookie 并将其设置为LoginCredentials.CustomCookies. 我已经将它与浏览器请求进行了比较,cookie似乎是正确的。该集合Request.Cookies包含两个 cookie,一个 Antiforgery,一个用于 Identity。
渲染失败,因为newPdf.RenderUrlAsPdf(uri)返回null,我不明白为什么。原因一定是失败的CustomCookies集合LoginCredentials,但堆栈跟踪没有提供任何关于失败的信息。需要明确的是,即使未使用授权,此方法也会失败。

var uri = new Uri("https://localhost:44362/invoice");
var cookies = Request.Cookies;
Dictionary<string, string> customCookies = cookies.ToDictionary(c => c.Key, c => c.Value);
var newPdf = new HtmlToPdf()
{
    PrintOptions = new PdfPrintOptions()
    {
        //..omitted for brevity
    },
    LoginCredentials = new HttpLoginCredentials()
    {
        EnableCookies = true,
        CustomCookies = customCookies
        //LoginFormPostVariables = new Dictionary<string, string>()
        //{
        //    { "Email", "username@domain.com" },
        //    { "Password", "secretysecret" }
        //},
        //LoginFormUrl = new Uri("https://localhost:44362/login")
    }
};
var result = newPdf.RenderUrlAsPdf(uri);
4

0 回答 0