在Office Add-in中实现单点登陆(SSO)
作者:陈希章 发表于 2017年12月27日
这篇文章经过多次修改,终于在今天晚上写完了,演示用的范例代码也终于跑通了。因为这个SSO的功能目前只是Preview的状态,所以本篇文章严格参考了官方的文档,并且对其中的重点环节做了提示,对最终效果做了说明。
官方的文档请参考 https://docs.microsoft.com/en-us/office/dev/add-ins/develop/sso-in-office-add-ins
Office Add-in SSO 认证流程和原理
实现Office Add-in 的单点登录是要解决一个典型问题:已登陆到Office的用户,能否直接利用他自己的身份去访问到Microsoft Graph的资源,而无需再次登录。
请注意,目前这个功能是Preview的状态。所以要进行测试的话,你必须是某个Office 365 Tenant的全局管理员。如果不具备这个条件,你将无法完成这个实验,但你可以通过这个文章对单点登录流程和效果有一个基本认识。
下图是Office Add-in中进行SSO认证的标准流程。这里面涉及到几个部分
- Office 宿主程序。
- Office Add-in
- Office Add-in Service(通常是一个API服务)
- Azure AD V2(请注意,必须是2.0)
- Microsoft Graph
基本流程如下
- Office Add-in发起一个请求,getAccessTokenAsync。
- Office 宿主程序会向Azure AD 发起一个请求,去获取当前用户的一个所谓的addin token。
- Office Add-in得到这个addin token后,将其发送到Office Add-in Service,并请求Microsoft Graph的资源。请注意,Office Add-in 和 Office Add-in service必须使用同一个域名。
- Office Add-in Service 向Azure AD发起请求,利用addin token交换得到真正的access token。
- Office Add-in Service 利用得到的access token去访问Microsoft Graph,并将结果返回给Office Add-in。
如何运行官方案例,体验Office Add-in SSO的效果
我是完全按照 这篇文章进行了实验,并且已经做出来效果。下面我将有关的步骤,尤其是一些要注意的步骤介绍一下。(该文档的部分地方存在一些小问题,我已经提报给作者了)。
实验环境。你需要安装最新的Visual Studio 2017和Office 2016(版本1708或者更新)。
克隆这个代码库 https://github.com/officedev/office-add-in-aspnet-sso。
在***Completed***目录中找到
Office-Add-in-ASPNET-SSO.sln,双击打开这个解决方案。此时编译解决方案会报错,请运行
Install-Package Microsoft.Identity.Client -IncludePrerelease命令安装一个包。再次编译,请确保没有任何错误。在 https://apps.dev.microsoft.com/ 注册一个应用程序,这个步骤比较重要,一定要严格按照说明操作。下面是我注册的信息,请一定要确保保持一致。

将上图中的Application ID和Application Secret信息记下来,并且将Application ID的信息替换掉这个地址中的占位符:https://login.microsoftonline.com/common/adminconsent?client_id={application_ID}&state=12345 得到 https://login.microsoftonline.com/common/adminconsent?client_id=f7e0154d-1258-42ef-9e89-9857889f4e01&state=12345。
目前来说,要测试这个功能,你必须拥有一个Office 365 Tenant的全局管理员身份。在浏览器中输入上面这个地址,然后提供你的管理员身份,你会收到如下的提示,要你接受授权的请求。
点击“Accept”(有时候可能要两次)后,页面会被重定向到下面的地址。请不要惊慌,因为当前我们的Office Add-in网站没有运行起来,所以确实会报告“无法访问此网站”。在这里,只要将地址栏中的tenant这个查询字符串的信息记下来即可(我的例子是:
ca2af238-5e61-4608-8622-797a954c4d65),后面要用到。
回到Visual Studio 2017里面来,找到
Office-Add-in-ASPNET-SSO-WebAPI这个项目中的Web.config文件,在appsettings里面修改几个设置信息。
在
Office-Add-in-ASPNET-SSO这个项目中,找到Office-Add-in-ASPNET-SSOManifest这个文件,在最底部,修改WebApplicationInfo这个节的信息如下:
选择
Office-Add-in-ASPNET-SSO这个项目,在右键菜单中选择“发布”,然后新建一个配置文件:
然后点击“打包外接程序”按钮
输入当前本地调试用的网址后点击“完成”,你将得到一个可以用于部署的清单文件

利用清单文件加载该Add-in。这个Add-in是用于PowerPoint的,它的详细代码我这里就不展开了,它实现了一个简单的功能用来读取当前用户的OneDrive for Business中的文件列表信息。
我的实验环境中,当前用户的OneDrive for Business中有如下的文件:
请在Visual Studio中将“Office-Add-in-ASPNET-SSO-WebAPI”这个项目运行起来,然后通过PowerPoint Online创建一个演示文档,在菜单中选择“插入”=》“Office 加载项”,然后选择“上载我的加载项”,选择上一步骤中生成的XML文件。
然后你可以在工具栏中看到一个新的按钮,点击之后可以显示一个任务面板
最后,激动人心的时刻终于要到了。点击任务面板中的“Get My Files From OneDrive”按钮,你将在任务面板的下方看到OneDrive for Business中的文件列表信息。
当然,很多时候,我也发现会遇到如下的错误。

结语
本文对于最新的Office Add-in中实现单点登录(SSO)的方案进行了讲解,并且将配套的实例进行了测试。由于当前这个功能还是非常早期的阶段,所以可能你在做实验的时候,也会遇到这样那样的问题。如果遇到,可以给我留言。我过一阵子会继续关注一下这个功能的进展,给大家更新。
在Office Add-in中实现单点登陆(SSO)的更多相关文章
- 解决Spring Boot 从1.x升级到 2.x 后 单点登陆(SSO)问题
解决Spring Boot 从1.x升级到 2.x 后 单点登陆(SSO)问题 在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把Spring S ...
- Spring Security 解析(六) —— 基于JWT的单点登陆(SSO)开发及原理解析
Spring Security 解析(六) -- 基于JWT的单点登陆(SSO)开发及原理解析 在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把 ...
- ASP.NET在不同情况下实现单点登陆(SSO)的方法
第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...
- CAS单点登陆 SSO
什么是单点登陆 SO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制.它是目前比较流行的企业业务整合的解决方 ...
- ASP.NET 单点登陆
第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...
- cas单点登陆。就这一篇就够了!!!!!
前言: cas是什么我就不累赘说了.就简单说下大致的流程.首先,cas是一个独立的项目.就是一个war包,部署在tomcat上面启动就ok.然后我们要实现单点登陆,无疑是访问系统1,如果没有登录,就跳 ...
- 集成基于OAuth协议的单点登陆
在之前的一篇文章中,我们已经介绍了如何为一个应用添加对CAS协议的支持,进而使得我们的应用可以与所有基于CAS协议的单点登陆服务通讯.但是现在的单点登陆服务实际上并不全是通过实现CAS协议来完成的.例 ...
- 集成基于CAS协议的单点登陆
相信大家对单点登陆(SSO,Single Sign On)这个名词并不感到陌生吧?简单地说,单点登陆允许多个应用使用同一个登陆服务.一旦一个用户登陆了一个支持单点登陆的应用,那么在进入其它使用同一单点 ...
- cookie+memcached实现单点登陆
10年的时候在iteye的第一篇文章记录了一下当时怎么实现我们系统的单点登陆.不过那个时候文章写的不好,思路也很浮躁,很难看懂,在csdn的第一篇技术博客打算重新温顾一下当时实现单点登陆的思路.先来看 ...
随机推荐
- java面试扫盲:对象初始化顺序(真的未必能答对)
记录下面试里面遇到的一些java盲区,一方面扫描自己的知识盲区,一方面也可以给后面面试的朋友一些警示,以免面试的时候出现不知道的尴尬情况. 提出问题:父类静态属性,父类属性,父类构造方法,子类静态属性 ...
- mybatis中sql语句的批量插入
<!-- 收件箱插入收件信息 --> <insert id="insertReceiveemail"> <!-- 生成一条U ...
- vsftpd 安装
vsftpd 安装 这里有最简洁的安装步骤 理想流程 [root@itdragon ~]# useradd ftpuser [root@itdragon ~]# passwd ftpuser Chan ...
- SSM框架下结合 log4j、slf4j打印日志
首先加入log4j和slf4j的jar包 <!-- 日志处理 <!-- slf4j日志包--> <dependency> <groupId>org.slf4j ...
- ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证
ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...
- day04 JS
很伤心,就在前天下午,本人的电脑突然挂了,电脑售后告知需要10个工作日才可修好. 于是乎,昨天学的内容来不及整理,暂且跳过,改天再抽空补上,就当缓几天再复习吧. 今天继续学习了JS的内容. 1 js的 ...
- C语言之阶乘
#include<stdio.h>#include<stdlib.h>#include<time.h>int main(){ int num,i,result=1; ...
- dnsmasq服务的安装与配置
在ubuntu16.04上安装dnsmasq服务,在本地做泛域名解析 安装 $ apt-get install dnsmasq -y $ /etc/init.d/dnsmasq start 配置 Dn ...
- Session、Cookie 学习笔记
在开始今天的博文之前首先为自己庆祝一下自己有了三个粉丝,也有了同僚的评论,说实话因为这个开心了好久!哈哈,好了在开始今天的正题之前,首先大家需要了解以下几点: a. HTTP 协议是无状态的协议,WE ...
- RFID电动车管理,智慧城市物联网建设的入口
原谷歌CEO施密特说:"我可以非常直接地说,互联网将消失." 互联网在20多年来帮助人们解决了信息共享.交互,几乎在瞬间颠覆了很多传统的商业模式,把卖产品变为卖内容和服务,是个了不 ...