如果我们在运行一个SharePoint的可以被匿名访问(anonymously accessible)的网站, 特别是面向Internet的网站, 你也许会注意到SharePoint的表单页面(form pages)也会对匿名用户开放. 比如说匿名用户可以访问开启了publishing feature的网站的这个页面http://SERVER/Pages/Forms/AllItems.aspx. 典型地, 如果你不想让用户访问到这些表单页面, 该怎么做呢?
解决方案
====================
为了达到我们的目的, 可以开启一个Out Of Box(OOB)的feature, 叫做ViewFormsPagesLockdown. 如果你不希望匿名用户访问表单页面, 我们可以使用如下的STSADM命令:
stsadm.exe –o activatefeature –url <site collection url> -filename ViewFormPagesLockdown\feature.xml
或者使用下面的PowerShell命令:
$lockdown = get-spfeature viewformpageslockdown
enable-spfeature $lockdown -url http://sitecollectionURL
上面的命令会在你的站点集上开启lockdown feature.
注意:
如果你已经开启了anonymous access, 你需要先disable掉anonymous access, 然后再开启anonymous access一次, 这样才能保证lockdown feature的配置重新生效.
完成之后, 可以尝试匿名方式访问一下http://SERVER/Pages/Forms/AllItems.aspx.
深层解释
===================
在SharePoint中, 匿名用户的权限是由一个叫做Limited Access的permission level决定的. Limited Access是一个特殊的permission level, 它不能被直接赋予某个用户或组.
Limited Access这个permission level存在的原因是这样的, 如果你有一个列表或站点的权限不是继承的(broken permissions inheritance), 并且你赋予某个用户或组仅能访问该列表或站点的权限, 那么为了让用户能够访问, 这个用户就必须对root web拥有权限. 否则, 即使该用户或组具备了访问指定列表或站点的权限, 他们也无法访问, 因为root web中有些东西是渲染那个列表或站点时必不可少的. 所以, 当你给某个用户仅能访问某个列表或子站点的权限并且继承权限已被打破时, SharePoint会自动地给那个用户或组在root web上赋予一个Limited Access权限.
这就解释了为什么你会看到某些用户或组具有Limited Access权限, 而你并没有进行过这样的权限赋予的动作. 但是, 匿名用户怎么办呢? 他们是如何被对待的呢? 正如上面提到的, 匿名用户的权限是被Limited Access决定的.
因为界面上是没有地方供我们修改匿名用户的permission level, 并且匿名用户权限是被这个permission level所确定的, 微软就创建了LockDown feature来开关几个权限. 特别地, lockdown feature会在Limited Access中移除掉View Application Pages permission和Use Remote Interfaces permission. 其中View Application Pages permission就是允许匿名用户访问表单页面的权限了.
为什么有些人在没有修改过lockdown feature是否开启的站点上会有问题呢? 这完全取决于你使用的站点的模板. 默认情况下, 在Publishing Portal模板中, lockdown feature是开启的. 对于其他站点模板, 如果你要拒绝匿名用户访问表单页面, 就运行上面的命令吧.
参考资料
==================
Lockdown Mode in SharePoint 2010
http://blogs.msdn.com/b/russmax/archive/2010/01/22/lockdown-mode-in-sharepoint-2010.aspx
Anonymous Users, Forms Pages, and the Lockdown Feature