我在使用外部网安全(基于ASP.Net成员资格)保护的网页上使用Winnovatives PDFConverter时遇到问题。
我尝试了几种不同的方法,但以下我可以在我的本地机器上工作,但不能在其他任何地方工作。
登录页面代码,此代码应绕过以下的登录过程:
// check that the current "user" isn't logged in and is the Winnovative UserAgent
if (!Sitecore.Context.IsLoggedIn && Request.UserAgent.Contains(".NET CLR"))
{
//Login with a dummy user I've created
Sitecore.Security.Authentication.AuthenticationManager.Login("extranet\\pdf", "pdf", true);
//redirect to former page
}
生成PDF的页面使用以下代码: private void PDFPrint(string url) {
PdfConverter pdfConverter = new PdfConverter();
pdfConverter.LicenseKey = "our license";
url = Request.Url.Scheme + "://" + Request.Url.Host + url;
byte[] downloadBytes = pdfConverter.GetPdfFromUrlBytes(url);
HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.AddHeader("Content-Type", "binary/octet-stream");
response.AddHeader("Content-Disposition", "attachment; filename=" + Sitecore.Context.Item.Name + ".pdf" + "; size=" + downloadBytes.Length.ToString());
response.Flush();
response.BinaryWrite(downloadBytes);
response.Flush();
response.End();
}
我得到的例外是:
“无法从网址获取图元文件。无法从网址获取图片。网址无法访问..”
我也从Winnovative FAQ中尝试过这个技巧但无济于事: http://www.winnovative-software.com/FAQ.aspx#authenticationQ
我还尝试使用WebClient或HttpWebRequest来检索内容。
但我所做的一切似乎都不是在本地工作。
基本上我想创建一种让Winnovatives转换器使用当前登录用户的方法,我的自定义“pdf”用户以及从响应中获取html的其他方式。
我希望这个问题不是太模糊,但我觉得很难问。但基本上我想从我控制的Sitecore解决方案的页面上获取一些html内容,这受到Sitecore普通Extranet安全性的保护。这个html内容应该是字符串或byte []格式。
帮我Stackoverflowers,你是我唯一的希望! :P
答案 0 :(得分:2)
我联系了Sitecore询问他们是否有解决方案。
他们的解决方案是创建一个处理器,根据某些标准设置活动用户。
这是我为我的网站制作的代码(它可能不是最好的解决方案,因为UserAgent可以被欺骗):
public class MyResolver : HttpRequestProcessor
{
// Methods
public override void Process(HttpRequestArgs args)
{
var userAgent = args.Context.Request.UserAgent ?? "";
SiteContext site = Sitecore.Context.Site;
if (site.Name == "site_name_in_webconfig" && userAgent.Contains("this_should_only_be_in_thepdfcreators_userAgent"))
{
Sitecore.Security.Accounts.User pdfuser = Sitecore.Security.Accounts.User.FromName("extranet\\theUser", true);
AuthenticationManager.SetActiveUser(pdfuser);
}
}
}
然后在UserResolver:
之前将以下内容添加到web.config中<processor type="Namespace.MyResolver, Assembly" />
我希望这会帮助其他人。
答案 1 :(得分:1)
我在ASP.NET论坛上发现了类似的问题,答案是使用更新版本的PDF工具:SessionState Problems ?