作者:陈希章 发表于 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认证的标准流程。这里面涉及到几个部分

  1. Office 宿主程序。

  2. Office Add-in
  3. Office Add-in Service(通常是一个API服务)
  4. Azure AD V2(请注意,必须是2.0)
  5. Microsoft Graph

基本流程如下

  1. Office Add-in发起一个请求,getAccessTokenAsync。

  2. Office 宿主程序会向Azure AD 发起一个请求,去获取当前用户的一个所谓的addin token。
  3. Office Add-in得到这个addin token后,将其发送到Office Add-in Service,并请求Microsoft Graph的资源。请注意,Office Add-in 和 Office Add-in service必须使用同一个域名。
  4. Office Add-in Service 向Azure AD发起请求,利用addin token交换得到真正的access token。
  5. Office Add-in Service 利用得到的access token去访问Microsoft Graph,并将结果返回给Office Add-in。

如何运行官方案例,体验Office Add-in SSO的效果

我是完全按照 这篇文章进行了实验,并且已经做出来效果。下面我将有关的步骤,尤其是一些要注意的步骤介绍一下。(该文档的部分地方存在一些小问题,我已经提报给作者了)。

  1. 实验环境。你需要安装最新的Visual Studio 2017和Office 2016(版本1708或者更新)。

  2. 克隆这个代码库 https://github.com/officedev/office-add-in-aspnet-sso

  3. 在***Completed***目录中找到 Office-Add-in-ASPNET-SSO.sln,双击打开这个解决方案。

  4. 此时编译解决方案会报错,请运行 Install-Package Microsoft.Identity.Client -IncludePrerelease 命令安装一个包。再次编译,请确保没有任何错误。

  5. https://apps.dev.microsoft.com/ 注册一个应用程序,这个步骤比较重要,一定要严格按照说明操作。下面是我注册的信息,请一定要确保保持一致。

  6. 将上图中的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。

  7. 目前来说,要测试这个功能,你必须拥有一个Office 365 Tenant的全局管理员身份。在浏览器中输入上面这个地址,然后提供你的管理员身份,你会收到如下的提示,要你接受授权的请求。

    点击“Accept”(有时候可能要两次)后,页面会被重定向到下面的地址。请不要惊慌,因为当前我们的Office Add-in网站没有运行起来,所以确实会报告“无法访问此网站”。在这里,只要将地址栏中的tenant这个查询字符串的信息记下来即可(我的例子是:ca2af238-5e61-4608-8622-797a954c4d65),后面要用到。

  8. 回到Visual Studio 2017里面来,找到 Office-Add-in-ASPNET-SSO-WebAPI 这个项目中的Web.config文件,在appsettings里面修改几个设置信息。

  9. Office-Add-in-ASPNET-SSO 这个项目中,找到 Office-Add-in-ASPNET-SSOManifest这个文件,在最底部,修改WebApplicationInfo这个节的信息如下:

  10. 选择Office-Add-in-ASPNET-SSO 这个项目,在右键菜单中选择“发布”,然后新建一个配置文件:

    然后点击“打包外接程序”按钮

    输入当前本地调试用的网址后点击“完成”,你将得到一个可以用于部署的清单文件

  11. 利用清单文件加载该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)的更多相关文章

  1. 解决Spring Boot 从1.x升级到 2.x 后 单点登陆(SSO)问题

    解决Spring Boot 从1.x升级到 2.x 后 单点登陆(SSO)问题   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把Spring S ...

  2. Spring Security 解析(六) —— 基于JWT的单点登陆(SSO)开发及原理解析

    Spring Security 解析(六) -- 基于JWT的单点登陆(SSO)开发及原理解析   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把 ...

  3. ASP.NET在不同情况下实现单点登陆(SSO)的方法

    第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...

  4. CAS单点登陆 SSO

    什么是单点登陆 SO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制.它是目前比较流行的企业业务整合的解决方 ...

  5. ASP.NET 单点登陆

    第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...

  6. cas单点登陆。就这一篇就够了!!!!!

    前言: cas是什么我就不累赘说了.就简单说下大致的流程.首先,cas是一个独立的项目.就是一个war包,部署在tomcat上面启动就ok.然后我们要实现单点登陆,无疑是访问系统1,如果没有登录,就跳 ...

  7. 集成基于OAuth协议的单点登陆

    在之前的一篇文章中,我们已经介绍了如何为一个应用添加对CAS协议的支持,进而使得我们的应用可以与所有基于CAS协议的单点登陆服务通讯.但是现在的单点登陆服务实际上并不全是通过实现CAS协议来完成的.例 ...

  8. 集成基于CAS协议的单点登陆

    相信大家对单点登陆(SSO,Single Sign On)这个名词并不感到陌生吧?简单地说,单点登陆允许多个应用使用同一个登陆服务.一旦一个用户登陆了一个支持单点登陆的应用,那么在进入其它使用同一单点 ...

  9. cookie+memcached实现单点登陆

    10年的时候在iteye的第一篇文章记录了一下当时怎么实现我们系统的单点登陆.不过那个时候文章写的不好,思路也很浮躁,很难看懂,在csdn的第一篇技术博客打算重新温顾一下当时实现单点登陆的思路.先来看 ...

随机推荐

  1. iOS获取所有机型

    1.手机系统版本:9.1 NSString* phoneVersion = [[UIDevice currentDevice] systemVersion]; 2.手机类型:iPhone 6 NSSt ...

  2. 预加载(图片,css ,js)

    图片预加载 new Image().src = 'http://img1.t.sinajs.cn/t35/skin/skin_008/skin.css'; //新浪(4) 非ie下预加载(js,css ...

  3. JSP7(Cookie与javamail)

    一.cookie是什么意思? 英文直接翻译过来的意思呢就是小甜品 Cookie英文意指饼干,不过在电脑术语中它可不像饼干那么简单.简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务 ...

  4. Ocelot网关

    Ocelot是一个.net core框架下的网关的开源项目,下图是官方给出的基础实现图,即把后台的多个服务统一到网关处,前端应用:桌面端,web端,app端都只用访问网关即可. Ocelot的实现原理 ...

  5. Nginx的知识分享,技术分享

    3. Nginx常用命令管理及升级 查看nginx进程 ps -ef|grep nginx 说明:nginx的进程由主进程和工作进程组成. 启动nginx nginx 启动结果显示nginx的主线程和 ...

  6. 在cmd中运行android.bat报出空指针异常

    因启动SDK manager和启动AVD manager 都发生闪退现象,网上很多方法都无法解决 又在cmd 中执行运行 D:\Program Files\Android_SDK\sdk\tools& ...

  7. CCF-201512-1-数位之和

    问题描述 试题编号: 201512-1 试题名称: 数位之和 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个十进制整数n,输出n的各位数字之和. 输入格式 输入一个整 ...

  8. js 数组去重复的方法

    数组去重复是js中常用的方法,归纳了四种如下: 1. for + indexOf  去重复 var arr = [3,5,5,4,1,1,2,3,7,2,5]; var target = []; fo ...

  9. 约瑟夫问题 小孩报数问题poj3750

    小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15228   Accepted: 6778 Descripti ...

  10. Java开发小技巧(三):Maven多工程依赖项目

    前言 本篇文章基于Java开发小技巧(二):自定义Maven依赖中创建的父工程project-monitor实现,运用我们自定义的依赖包进行多工程依赖项目的开发. 下面以多可执行Jar包项目的开发为例 ...