前段時間在做一個項目,要求將SharePoint 的 OWA(Office Web Apps)中的文檔顯示頁面嵌入到另外一個OA系統中,提供給用戶可以通過瀏覽器查看SharePoint文檔的能力。
嵌入我們能想到的方法就是 Iframe,這里我們暫且忽略可能存在的SSO問題。
當將SharePoint頁面嵌入到Iframe中的時候,遇到了一個問題。
“此網頁不能顯示在一個框架中 ……”,后來經過反復的查找原因,也參考了國外的網站內容。
X-Frame-Options 就是它折磨了我一天多。后來在發現在我買了很久卻只看了一章的書里有這個內容的介紹,《白帽子講Web安全》中有一章就介紹了 X-Frame-Options,主要用來防止 ClickJacking(點擊劫持)。是一種安全策略。
這個時候就不難理解SharePoint為什么會出現這種錯誤了。
錯誤原因找到了,接下來就是 解決它。
解決的思路是 用程序將 X-Frame-Options 刪除掉。這樣做有些冒險。但在內網環境中,我倒覺得完全可以一試。
具體方法
1. 在VS中創建一個SharePoint 解決方案項目,選擇場解決方案。
2. 在項目中添加一個Feature,並為Feature添加Event事件。
3. 右鍵點擊項目名稱,選擇新建項。選擇ASP.Net模塊。
4. 輸入以下代碼。
public class PermissiveXFrameHeaderModule : IHttpModule
{
private const string XFRAMEOPTIONS_HEADERNAME = "X-FRAME-OPTIONS";
private void context_PreSendRequestHeaders(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
application.Response.Headers.Remove("X-FRAME-OPTIONS");
}
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += new EventHandler(this.context_PreSendRequestHeaders);
}
}
5. 在Feature的事件程序中 添加代碼如下
public class Feature1EventReceiver : SPFeatureReceiver
{
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPWebApplication application = (SPWebApplication)properties.Feature.Parent;
foreach (SPWebConfigModification modification in this.Modifications)
{
application.WebConfigModifications.Add(modification);
}
application.WebService.ApplyWebConfigModifications();
application.Update();
}
public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
SPWebApplication application = (SPWebApplication)properties.Feature.Parent;
foreach (SPWebConfigModification modification in this.Modifications)
{
application.WebConfigModifications.Remove(modification);
}
application.WebService.ApplyWebConfigModifications();
application.Update();
}
private SPWebConfigModification[] Modifications
{
get
{
SPWebConfigModification[] modificationArray = new SPWebConfigModification[1];
SPWebConfigModification modification = new SPWebConfigModification("add[@name='PermissiveXFrameHeaderModule']", "configuration/system.webServer/modules");
modification.Owner = "PERMISSIVEXFRAME";
modification.Sequence = 0;
modification.Type = 0;
modification.Value = "<add name=\"PermissiveXFrameHeaderModule\" type=\"XMlFrame.PermissiveXFrameHeaderModule, XMlFrame,Version=1.0.0.0, Culture=neutral, PublicKeyToken=16937942f8602783\" />";
modificationArray[0] = modification;
return modificationArray;
}
}
6. 最后一步 就是部署它 就ok了
好吧,我承認我這個參考了老外寫的東西,但日子有點久了,實在不知道他是誰了 blog地址是什么了。