除非开启了SharePoint网站的匿名访问,否则对于入站的请求,必须要有一个身份验证的过程(Authentication),这个很重要。

SharePoint身份验证依赖于目录服务(如AD、identity providers(IdPs)像Google和Facebook),服务(如IIS、Azure Access Contro Service(ACS),以及Active Directory Services(ADFS)来实现它的身份验证业务逻辑。

基于编程模型的改变,SharePoint 2013需要处理两种类型的认证:用户认证和APP认证。对于用户认证,SharePoint使用安全组和存储在内容数据库中的Access Control List(ACL)来跟踪,但是对于APP,SharePoint使用了另一种方式。APP的认证通过ACS来提供给SharePoint,叫做OAuth(OAuth 2.0是OAuth的下一个版本,需要HTTPS)。这种架构使得用户可以授权APP去代表他们工作而不需要保存他们的凭据信息。

当SharePoint收到一个入站请求时,会检查请求中是否包含标识用户身份的登录令牌,如果找到该令牌,SharePoint就假定该请求是由通过验证的用户发出的而不是APP。然后SharePoint会检查请求的目标URL指向的是一个标准的网站还是与APP有关系的子网站(APPWeb)。如果该请求指向了一个标准的网站,那么SharePoint 2013会遵循之前版本典型的认证过程;如果是与APP相关的话,则会初始化一个包含用户认证和APP认证的上下文(context)。

如果没有找到登录令牌,SharePoint就知道这不是用户发起的请求。在这种情况下,SharePoint会寻找OAuth令牌来识别远程应用。当找到安全令牌之后,它会创建包含APP认证和用户认证(可选)的上下文。

身份认证(Authentication)之后再来看授权(Authorization)。上下文创建之后,SharePoint会决定授予APP什么样的权限,跟用户权限一样,SharePoint通过自身的内部内容数据库来跟踪授权。

具体的认证授权流可参加下图,更多信息

每个APP都有一个manifest.xml清单文件,开发人员可以在这里通过AppPermissionRequests节点来定义APP需要访问的资源列表,下面的代码片段提供了一个示例(provider-hosted APP):

<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection" Right="Read"/>
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web/list" Right="Write">
<Property Name="BaseTemplateId" Value="101"/>
</AppPermissionRequest>
<AppPermissionRequest Scope="http://sharepoint/userprofilestore/feed" Right="Post"/>
<AppPermissionRequest Scope="http://exchange/calendars" Right="Schedule"/>
</AppPermissionRequests>

注意这里面的第一行,APP的权限请求启用了app-only策略,它意味着只有APP(没有当前用户)需要必要的权限。如果没有使用该策略,则表示APP和当前用户都需要必要的权限来完成任务如访问整个网站集或在列表中创建项目,这会使上下文同时包含APP和用户的身份。

app-only策略可以提高APP的权限,使得它可以比当前用户做更多的事。当用户安装包含AppPermissionRequest条目的APP时,该用户必须在安装时授予APP清单中声明的权限。

ACS不能在本地部署的非Office 365环境中使用,意味着本地部署也没有OAuth令牌。本地APP需要使用一种不同的安全令牌,该令牌由Server-to-Server(S2S)配置创建,更多信息

关于APP的安全,我们还应该知道以下事情:

APP运行在它们自己的域内(防止跨网站脚本攻击),用JavaScript编写,但这并不意味着它们是安全的。作为开发人员,仍需考虑因为APP的设计导致的安全漏洞和敏感信息泄漏的问题。

SharePoint-hosted APP没有指定列表或网站级别的授权,换句话说,如果一个APP对一个列表有写入权限,它对另一个列表也有。

当用户为provider-hosted APP授权的时候,这是一个一次性过程,即使之后APP的逻辑代码改变了,SharePoint对此也并不知情。

当APP使用OAuth令牌来完成一些任务时,页面上另一个APP也可以使用该APP的身份和用户的身份。在这种情况下,黑客可以通过不安全的通信协议(HTTP)来拦截OAuth令牌。

所以,我们在开发APP时,需要用心设计并尽量使用HTTPS来加密通信协议。

SharePoint 2013 开发——APP安全模型的更多相关文章

  1. SharePoint 2013 开发——APP开发的考虑和建议

    博客地址:http://blog.csdn.net/FoxDave 需要考虑的方面: 1. 记得CSOM授予网站集及以下的权限,而场解决方案需要整个场的访问权限. 2. 由于应用程序是彼此完全独立 ...

  2. SharePoint 2013 开发教程

    做了SharePoint有三年了,大家经常会问到,你的SharePoint是怎么学的,想想自己的水平,也不过是初级开发罢了.因为,SharePoint开发需要接触的东西太多了,Windows操作系统. ...

  3. SharePoint 2013 开发——概述

     博客地址:http://blog.csdn.net/FoxDave 近来阅读SharePoint 2013开发一书,带着与大家一起分享其中的内容. 部署场景: 本地部署(On-Premise D ...

  4. 系列文章--SharePoint 2013 开发教程

    做了SharePoint有三年了,大家经常会问到,你的SharePoint是怎么学的,想想自己的水平,也不过是初级开发罢了.因为,SharePoint开发需要接触的东西太多了,Windows操作系统. ...

  5. SharePoint 2013 搭建app本地开发环境

    使用SharePoint App,如果要通过应用程序目录分发 SharePoint 相关应用程序,如具有完全控制权限的 SharePoint 相关应用程序(无法部署到 Office 365 网站),则 ...

  6. SharePoint 2013 开发——开发自定义操作APP

    博客地址:http://blog.csdn.net/FoxDave 自定义操作即我们所说的Ribbon和ECB(Edit Control Block),在SharePoint 2013之前,我们可以 ...

  7. SharePoint 2013 开发——Provider-hosted APP准备工作

    博客地址:http://blog.csdn.net/FoxDave 后续的内容我们来一步一步开发一个SharePoint Porvider-hosted APP,本篇主要介绍一些准备工作. Sha ...

  8. SharePoint 2013 开发——开发并部署第一个APP

    博客地址:http://blog.csdn.net/FoxDave 本篇我们开始对开发APP应用程序进行了解. 本篇基于本地SharePoint环境(如果是Office 365的话会方便许多),需 ...

  9. SharePoint 2013 开发——SharePoint APP介绍

     博客地址:http://blog.csdn.net/FoxDave 新的APP模型让我们能够创建看起来像是SharePoint的一部分的应用程序,但是它完全运行在独立于SharePoint服务器 ...

随机推荐

  1. Spring多数据源的配置和使用

    1. 配置多个数据源 最近开发一个数据同步的小功能,需要从A主机的Oracle数据库中把数据同步到B主机的Oracle库中.当然能够用dmp脚本或者SQL脚本是最好,但是对于两边异构的表结构来说,直接 ...

  2. matlab中图像显示函数

    image函数是显示图像的最基本的方法.该函数还产生了图像对象的句柄,并允许对对象的属性进行设置. imagesc函数也具有image的功能,所不同的是imagesc函数还自动将输入数据比例化,以全色 ...

  3. Webdriver - Selenium Grid Configuration

    Grid parameter: role = <hub|node> (default is no grid, just run an RC/webdriver server). When ...

  4. JSP Filter

    Servlet过滤器方法 一个过滤器就是一个Java类,它实现了javax.servlet.Filter 接口.javax.servlet.Filter接口定义了三个方法: 序号 方法 &描述 ...

  5. dede会员指定栏目发布文章

    后台——核心——网站栏目管理——修改栏目——常规选项——支持投稿

  6. mysql spider之拆库无忧

    数据库的三板斧 先上MySQL,之后再上读写分离,然后呢? 后面典型的做法是垂直拆库和水平分表. 一旦数据库拆了之后,代价就来了. 1.事务不能跨库了(少,但是很重要,可以适当改写) 2.相关的关联查 ...

  7. VS2012给同一个解决方案添加多个项目

    1.选择文件->添加->新建项目或现有项目 2.接下来在解决方案资源管理器中我们会发现解决方ConsoleApplication1中有两个项目,这里一个是类库项目ClassLibrary1 ...

  8. python 练习 26

    Python break语句,就像在C语言中,打破了最小封闭for或while循环. break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句. br ...

  9. [bootstrap] 实用的bootstrap模版下载

    https://shapebootstrap.net/ http://shapebootstrap.net/item/1524915-adminlte-dashboard-and-control-pa ...

  10. IO流--切割 合并文件

    import java.io.*; import java.util.*; public class io { public static void main(String[] args)throws ...