我正在尝试从需要身份验证的页面打印出 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);