RSS

Monthly Archives: 九月 2010

ASP.NET安全隐患及SharePoint中的Workaround

09.29更新:微软已经发布了补丁,详细说明见:http://www.microsoft.com/technet/security/bulletin/MS10-070.mspx

前几天的一个安全会议上公布了一个ASP.NET中的安全隐患(在1.0至4.0的版本中均存在),黑客可以使用这个隐患获取到网站的web.config文件(往往保存了一些敏感信息,如数据库连接字符串等)以及获取ViewState中的加密信息。

微软在前两天发布了Workaround,这个安全隐患对SharePoint的影响涉及到如下版本的产品:

  • SharePoint 2010 Server & Foundation
  • Office SharePoint Server 2007
  • Windows SharePoint Services 3.0 & 2.0

一个暂时的解决办法如下:

针对SharePoint 2010 (Server & Foundation)

1、进入到前端服务器的layouts目录(%ProgramFiles%\Common Files\Microsoft Shared\Web Server Extensions\14\template\layouts)

2、创建一个error2.aspx,包含如下内容:

   1: <%@ Page Language="C#" AutoEventWireup="true" %>
   2: <%@ Import Namespace="System.Security.Cryptography" %>
   3: <%@ Import Namespace="System.Threading" %>
   4:  
   5: <script runat="server">
   1:  
   2:    void Page_Load() {
   3:       byte[] delay = new byte[1];
   4:       RandomNumberGenerator prng = new RNGCryptoServiceProvider();
   5:  
   6:       prng.GetBytes(delay);
   7:       Thread.Sleep((int)delay[0]);
   8:         
   9:       IDisposable disposable = prng as IDisposable;
  10:       if (disposable != null) { disposable.Dispose(); }
  11:     }

</script>

   6:  
   7: <html>
   8: <head runat="server">
   9:     <title>Error</title>
  10: </head>
  11: <body>
  12:     <div>
  13:         An error occurred while processing your request.
  14:     </div>
  15: </body>
  16: </html>

3、进入到IIS虚拟目录(%SystemDrive%\inetpub\wwwroot\wss\virtualdirectories)

4、在每个网站的虚拟目录中,将web.config中的customErrors结点修改为:

   1: <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/_layouts/error2.aspx" />

5、进入到SharePoint Root的ISAPI目录(%ProgramFiles%\Common Files\Microsoft Shared\Web Server Extensions\14\isapi)

6、备份其中的web.config文件,并在<system.web>之前加入如下内容:

   1: <system.webServer>
   2:     <handlers>
   3:         <remove name="AssemblyResourceLoader-Integrated-4.0" />
   4:         <remove name="AssemblyResourceLoader-Integrated" />
   5:     </handlers>
   6: </system.webServer>

7、重启IIS

在SharePoint 2007(MOSS & WSS 3.0)中

1、进入12目录的ISAPI子目录(%ProgramFiles%\Common Files\Microsoft Shared\Web Server Extensions\12\isapi)

2、备份其中的web.config,并在<customErrors mode=”On” />之后,加入如下内容:

   1: <httpHandlers>   
   2:    <remove path="WebResource.axd" verb="GET"/>    
   3: </httpHandlers>

3、重启IIS

参考文章:

1、Important: ASP.NET Security Vulnerability

2、Security Advisory 2416728 (Vulnerability in ASP.NET) and SharePoint

 

Posted by on 2010 年 09 月 22 日 in 未分类

Leave a comment

在SharePoint 2010的Web部件页中恢复左侧导航

在SharePoint默认的几种Web部件页中,均是不包含左侧导航的(或者叫快速启动栏),原因在于这些Web部件页的模板都重新定义了母版页中左侧导航区域的ContentPlaceHolder,将里面的内容设置为空白。

在SharePoint 2007的时候,恢复Web部件页的左侧导航很容易,直接用Designer编辑页面,将页面中PlaceHolderLeftNavBar的Content控件删掉即可,使用母版页中默认定义的内容。

但是到了SharePoint 2010中,这样一个步骤还不够。由于在2010中母版页完全采用div+css的布局,因此在Web部件页中还有额外的内容来隐藏掉左侧导航,将下面这部分内容也一并删掉即可:

   1: <SharePoint:UIVersionedContent ID="WebPartPageHideQLStyles" UIVersion="4" runat="server">
   2:     <ContentTemplate>
   3: <style type="text/css">
   4: body #s4-leftpanel {
   5:     display:none;
   6: }
   7: .s4-ca {
   8:     margin-left:0px;
   9: }
  10: </style>
  11:     </ContentTemplate>
  12: </SharePoint:UIVersionedContent>

当然,如果需要恢复所有Web部件页的左侧导航,可以直接修改Web部件页的模板,位置在:C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\2052\STS\DOCTEMP\SMARTPGS

 

Posted by on 2010 年 09 月 22 日 in 未分类

Leave a comment

Tags:

按条件决定SharePoint 2010日历颜色

SharePoint 2010中对列表的日历视图有了极大的改进,之前曾经简单写过一篇blog进行了一些简单介绍。新的日历视图的渲染方式与之前完全不同,采用了AJAX后台加载、JavaScript渲染的机制,极大的提高了日历的显示效率(在SharePoint 2007的时候日历渲染是非常非常慢的)。不过也正是因为所有的日历都是使用AJAX加载、然后用JavaScript进行显示的,这也导致了对日历样式的控制变得更加复杂。

最近某个客户有这样一个需求:希望能够在日历视图中,根据不同情况将条目显示为不同的颜色,经过一番研究之后,找到了如下解决方案(不需要编写后台代码,仅通过十几行js代码就可以)。

第一个问题,如果分辨应该使用什么颜色?这个颜色条件可以采用日历列表中“地点”字段来进行判断,比如写成“因私外出”显示成红色、写成“因公外出”显示成蓝色、写成“办公室”显示成绿色,客户同意通过制度来限制此字段的填写(在实际场景中,日历是通过个人的Outlook填写,并同步到SharePoint上的)。

第二个问题,如何将“地点”这个字段显示出来,并且作为能够判断颜色的依据?这方面,可以借助日历视图设置中的“副标题”进行控制。在周视图和日视图中,都可以设置一个字段为“副标题”,显示在标题的下方,在页面中就可以通过js代码来得到这个副标题。那你可能会有一个疑问:在月视图中怎么办?实际上,如果设置了副标题的话,不论是月视图、周视图还是日视图,在显示日历条目的那个div元素上,都会包含一个title属性,格式为:“开始时间 – 结束时间  标题(副标题)”。因此,我们只需要把“地点”字段设置成周视图和日视图的副标题即可(月视图采用周视图的副标题字段作为title属性)。

最后一个问题,如何动态来控制颜色。刚刚曾经提到过,在2010的日历视图中,日历条目都是通过AJAX进行加载的,我研究了一下SharePoint日历渲染的那个js文件(好几百KB),发现没有开放出加载完成的事件接口(这个文件估计是用C#代码转换出来的,比较难读)。因此,我们就只能通过最土的方法:不断轮询页面日历中的条目div,找到之后,再根据div的title属性来判断应该显示为哪种颜色,日历条目的div有一个专门的class:ms-acal-item,通过jquery,我们可以很容易使用class名称来找到这些条目。

综上,实现的方式为:在有日历的页面中添加一个内容编辑器,里面写上如下的js代码:

   1: <script src="/_layouts/jslib/jquery.js" type="text/javascript"></script>
   2: <script type="text/javascript">
   3: var _calColorMap = {"ok":"#ff0000"};
   4: function _calColor(){
   5:   $('div.ms-acal-item').each(function(){
   6:     var title = $(this).attr('title');
   7:     if(typeof(title) != 'undefined' && title != null){
   8:       if(title.lastIndexOf(')') == (title.length - 1)){
   9:         title = title.substring(title.lastIndexOf('(') + 1, title.length -1);
  10:         if(typeof(_calColorMap[title]) != 'undefined'){
  11:           $(this).css('background-color', _calColorMap[title]);
  12:         }
  13:       }
  14:     }
  15:   });
  16:   setTimeout('_calColor()');
  17: }
  18: ExecuteOrDelayUntilScriptLoaded(_calColor, "SP.UI.ApplicationPages.Calendar.js");
  19: </script>

稍微对这段代码进行一些解释:

第1行,引用jquery的脚本文件。我这个demo里面只是一个演示,更好的做法是把js的引用通过feature的方式加入到母版页的head标签里面;当然,引用的位置也可以放到文档库里,或者如果企业策略允许服务器访问外网的话,可以直接从jquery网站里面去进行引用。

第3行,这里面设置了一个字典变量,来进行“地点”-“颜色”的映射,这个demo里将“ok”地点显示成红色(#ff0000),当然,这个映射关系完全也可以通过后台的一些配置列表来实现,以js的形式输出到页面中就可以。

中间的部分就是判断div的title属性,找到对应的“地点”,并设置div的颜色。

第16行,将这个方法每隔50毫秒就执行一次。因为2010的日历视图在切换显示时间、显示方式的时候是没有后台代码提交的,页面不会刷新,全都是js操作,所以有必要随时进行页面元素的遍历(不用担心浏览器执行效率,我测试过,50毫秒的间隔对浏览器的CPU占用没有丝毫影响)。

第18行,这个是SharePoint 2010中的方法,意思是在页面加载完“SP.UI.ApplicationPages.Calendar.js”这个js文件之后,再执行_calColor这个方法(SharePoint 2010中很多js文件都是动态加载的)。

下图是这段代码在一个日历视图上的执行效果(月视图,test那个是全天事件,所以没有显示时间):

image

这个是使用“地点”字段进行颜色的判断,各位看官稍加发挥一下就可以根据自己的需要进行颜色的设置了。

在SharePoint 2007中使用后台代码进行自定义日历显示的时候(使用SPCalendarView控件),是可以设置每个日历项的颜色的,不过这段代码到了2010中似乎会有一些问题,一些老外已经有了blog去描述这个问题(大致解决方法就是将日历视图的显示回复成v3的模式,这个控件有一个属性可以控制是v3模式显示还是v4模式),篇幅所限就不在此赘述了,有需要的看官可以直接去google一下。

 

Posted by on 2010 年 09 月 20 日 in 未分类

Leave a comment

Tags:

SharePoint 2010 SDK更新

更新内容主要包括:

  • 新的code sample
  • 更新的文档(包括how-to等等)
  • 对vs编辑xml文件的一些智能感知有所更新

下载地址:

http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=f0c9daf3-4c54-45ed-9bde-7b4d83a8f26f

 

Posted by on 2010 年 09 月 12 日 in 未分类

Leave a comment

带有权限设置的Excel协同编辑

经常会遇到有类似表单协作的应用,主要场景可以归结为:

  1. 表单需要多个人来分别填写
  2. 每个人填写表单的不同部分,而且不能互相填写
  3. 填写的时候有可能多个人同时在编辑

这样的需求中使用Excel可以很方便地来实现,方式如下:

首先,第一问题很容易解决,我们可以把Excel放到一个共享文件夹或者SharePoint的一个文档库里(这两种方式对于同时编辑的支持有所不同);

其次,每个人填写Excel的不同部分,而且不能填写和自己无关的部分,这个功能可以使用Excel中的“保护工作表”以及“允许用户编辑区域”来设定:

功能一:保护工作表

在Ribbon的“审阅”选项卡中(这些功能在Excel 2007和2010中都可以实现,2003未经验证),有一个“保护工作表”,如下:

image

该功能可以将当前工作表锁定,不允许用户进行编辑(当然也可以用下面的那个按钮来保护整个工作簿),点击后会弹出下面这个对话框,输入一个密码,当用户需要解除保护的时候,需要输入这个密码:

image

功能二:开放允许用户编辑的部分

这部分操作需要在保护工作表之前完成,因为在保护之后就不允许对其进行修改了。

Step 1:点击同一个Ribbon标签中的“允许用户编辑区域”,会弹出下面这个对话框:

image

Step 2:这个对话框中会列出所有在保护工作表的时候,可以由用户来填写的部分,点击“新建”,创建一个新的区域:

image

Step 3:为区域加一个标题,然后选中需要由某个用户编辑的单元格,接下来的这个部分则是为单元格设置权限的重点:

Step 4:在“区域密码”中,输入一个密码,这个密码的含义是说:如果用户需要编辑这个单元格,则需要先输入这个密码才可以。那你要说,那岂不是还要告诉每个用户这个密码么?不用,我们可以点击“权限”,然后选择允许编辑这个区域的用户,然后选择“无需密码的编辑区域”(默认就是选中的),如下图:

image

在经过这样的设置之后,当Manager这个账号打开这个Excel的时候,就可以不用输入密码而编辑这个区域;而当其他用户打开这个Excel的时候,如果也想要编辑这个区域,就需要正确的密码才可以了,其他用户在这些单元格中试图输入的时候会出现下面这个提示:

image

通过重复进行Step 2 ~ Step 4的操作,就可以给不同的用户设置不同的编辑区域了。

功能三:多人同时编辑Excel

Excel其实在很早的时候就可以支持多人同时编辑同一个文件这样的应用场景,但是这要根据我们会把Excel放到什么位置进行共享。

情景 1:如果Excel是在网络的共享文件夹中,则可以实现真正的多人同时编辑。

点击同样Ribbon中的“共享工作簿”,弹出下面这个对话框:

image

选择“允许多用户同时编辑”,之后,在“高级”标签中还可以选择修改的记录等更加复杂的设置。

在这样设置之后,就可以进行同时编辑了。在编辑的过程中,如果用户正在一个单元格中输入,则系统会将其他用户的Excel中的这个单元格临时锁定,用户编辑完之后提交保存的时候,会首先检测其他用户是否已经提交过他们自己的保存,并把其他用户保存的内容更新进来(注意只有在保存的时候会更新其他用户保存的内容,以便控制服务器流量),如下图所示:

image

其他用户更新的内容会使用红色边框标记出来。

TIP:在SharePoint 2010 + Word 2010的配合中,可以实现Word文档的多人同时编辑,其操作方式也是类似的,不过是按照段落为单位进行锁定。

情景 2:Excel保存在SharePoint中。

如果Excel是保存在SharePoint 2010企业版中,当网站开启了Excel Service的时候,就可以在浏览器中进行多人同时编辑(不过功能二的设定貌似不支持Excel Service)。

如果是保存在SharePoint 2007中时,是不支持多人同时编辑同一个Excel文档的,不过会有通知提醒,例如一个用户打开并编辑一个在文档库中的Excel之后、未关闭之前的时候,另一个用户也打开同一个Excel文档并进行编辑的时候,会弹出如下的提示:

image

这里会提醒我们这个Excel文件正在由其他人进行编辑,我们可以选择“只读”仅查看Excel的内容,或者选择“取消”不打开该文档,或者,选择“通知”进行自动通知。

当这个用户选择了“通知”之后,可以如往常一样进行内容的查看(也可以进行编辑),而当第一个用户编辑完成、保存、关闭了Excel文档之后,这个新用户的Excel中就会自动弹出这样一个通知:

image

选择“读-写”之后,会把整个文档的内容更新为最新的版本(在这个期间内,这个新用户所进行的所有修改都会丢失),如下图所示:

image

通过这种方式,可以实现“非同时”的Excel协作编写了。

 

Posted by on 2010 年 09 月 02 日 in 未分类

Leave a comment