从零开始的生活是充实的!
SharePoint搞到牛叉!
前段时间在做一个项目,要求将SharePoint 的 OWA(Office Web Apps)中的文档显示页面嵌入到另外一个OA系统中,提供给用户可以通过浏览器查看SharePoint文档的能力。

嵌入我们能想到的方法就是 Iframe,这里我们暂且忽略可能存在的SSO问题。

当将SharePoint页面嵌入到Iframe中的时候,遇到了一个问题。

截图01

“此网页不能显示在一个框架中 ……”,后来经过反复的查找原因,也参考了国外的网站内容。

X-Frame-Options 就是它折磨了我一天多。后来在发现在我买了很久却只看了一章的书里有这个内容的介绍,《白帽子讲Web安全》中有一章就介绍了 X-Frame-Options,主要用来防止 ClickJacking(点击劫持)。是一种安全策略。

这个时候就不难理解SharePoint为什么会出现这种错误了。

错误原因找到了,接下来就是 解决它。

解决的思路是 用程序将 X-Frame-Options 删除掉。这样做有些冒险。但在内网环境中,我倒觉得完全可以一试。

具体方法

1. 在VS中创建一个SharePoint 解决方案项目,选择场解决方案。

2. 在项目中添加一个Feature,并为Feature添加Event事件。

3. 右键点击项目名称,选择新建项。选择ASP.Net模块。

截图00

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地址是什么了。

posted on 2013-08-07 15:48  Yunliang Yu  阅读(3438)  评论(0编辑  收藏  举报