Я пытаюсь распечатать счет в формате 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:
Я получаю повар авторизации ie из исходного запроса. Это работает, по крайней мере, настолько, что я действительно могу получить повара ie и установить его на LoginCredentials.CustomCookies
. Я сравнил его с запросом браузера, и повар ie кажется правильным. Коллекция Request.Cookies
содержит два файла cookie, один для защиты от подделки и один для идентификации.
Рендеринг не выполняется, потому что 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);