为什么在SharePoint中使用FormDigest控件

来源:互联网 发布:陈奕迅 苦瓜 知乎 编辑:程序博客网 时间:2024/04/29 10:45

FormDigest Control:

每个SharePoint开发人员都应该知道 "FormDigest" 控件,特别是那些正在开发Master Pages, Site Pages和application Pages的开发人员.


接下来我将从以下几个方面讲解FormDigest控件的应用:

1. 什么是FormDigest控件?

2. 为什么每个master page都需要添加FormDigest空间, 加它主要是为了做什么?

3. "The Security validation for this page is Invalid?" 这个异常信息.

4. 什么时候,什么地方以及为什么在SharePoint里面使用"AllowUnsafeUpdates" ?

5. 如何编程实现对SharePoint数据进行处理?


什么是FormDigest控件


当我们需要对SharePoints数据进行修改操作时, 页面中必须包含FormDigest控件来为安全验证创建digest, 它主要基于当前的用户,站点和时间在你的页面中添加一个安全标示(security token), 一旦页面post back回到SharePoint Server上, 这个安全标示会被验证.这个安全标示一旦创建出来,它只在在一个可设置的时间段是有效的.

由于安全问题, 默认情况下,Microsoft SharePoint Foundation不允许你从一个Web application 往回Post数据来修改存储在数据库中的数据, 除非你在发送这个Post请求时在页面中包含了安全验证. 你可以通过为一个单独的Site Collection直接添加一个页面,再在这个页面中添加FormDigest控件后进行页面请求更新数据.


Note: 需要FormDigest控件的主要原因是预防cross-scriptiing攻击和做安全验证.


默认情况下,default.master[在SharePoint2010里是v4.master]包含了一个"FormDigest"控件, 这么做的原因就是预防cross-site scripting攻击.


为了从Content DB中通过Get操作取数据, 我们需要设置AllowUnsafeUpdates = true. 在通过Set操作修改Content DB中的内容时,不需要设置AllowUnsafeUpdates = true, 原因MasterPage中包含的"FormDigest"帮我们做了安全验证.


为什么每个master page都需要添加FormDigest空间, 加它主要是为了做什么?


我猜大家都已经知道什么是Master page以及为什么要用master page. 好的. 我已经开发了一些页面, 通过这些页面,我想对SharePoint数据进行一些修改[指的是对Content DB中的数据], 但是不进行验证直接对Content DB修改安全吗, 如果你试着这么做, 你会收到'The security validation for this page is invalid' 异常.


让我们再回到今天讨论的主题, 为了验证我们更新的数据是否有效需要做些什么, 怎么做呢? 不用担心,SharePoint已经给出了解决方案. 解决方案就是 "FormDigest"控件, "FormDigest"控件会帮我们做这些验证, 在上文我已经解释了什么是 "FormDigest"控件. 再读一遍,现在你能理解的更清晰.


为了通过SharePoint的安全验证直接操作 content DB中数据, 我们需要把"FormDigest"控件放到所有的需要的页面中, 这就需要我们考虑把"FormDigest"控件直接放到每个页面中是否合适, 一个更好的地方是把这个控件放在master page中, SharePoint Team已经考虑到这点, 这就是为什么SharePoint中的所有Master page已经包含了这个控件.


但是, 有些情形下,我们需要对SharePoint 数据进行的操作即时这些数据是不安全的(不能通过安全验证), 怎么避免以上的异常来进行我们的操作呢? 不用担心,SharePoint 也考虑到了这一点, 解决方案是:"AllowUndafeUpdate".


最专业的描述“FormDigest” 控件应该是:


为了从一个Web application发送 Post请求修改数据库中的内容,你必须在你post的form表单中包含FormDigest控件


这里最关键的一条信息是:“SharePoint的安全验证关联着某个时间段的某个用户正在操作的站点, 并且这个安全验证在一个可设置的时间后过期”


当你想通过GET 请求更新SharePoint数据库中的数据时,你需要把"AllowUnsafeUpdates"设置成true, 请参考What/Why/Where On "AllowUpdateUpdate"

原创粉丝点击