Office Word加载项SSO配置疑问:跨项目与同项目部署问题
解决Word加载项SSO跨独立项目(加载项+API)的配置问题
我之前也遇到过类似的跨项目SSO配置问题,官方示例的单域场景确实和实际多项目场景有差异,你之前把API的Auth代码移到加载项里的思路不太对——令牌验证的核心逻辑应该留在API项目,加载项只负责获取令牌并传递给API,同时要解决跨域访问的问题。下面是具体的调整方案:
1. 还原并调整API项目的SSO配置
把你之前移到加载项里的OpenIdConnectCachingSecurityTokenProvider、Startup.Auth以及验证相关代码还原到API项目中,这部分是API验证Office令牌的核心:
- 确保
Startup.Auth里正确配置了Azure AD的租户ID、API的客户端ID,以及令牌验证逻辑; - 在API的
Startup.cs中添加CORS策略,允许加载项域名的跨域请求(必须开启凭证支持,因为SSO令牌需要在请求中携带):services.AddCors(options => { options.AddPolicy("AllowAddInOrigin", builder => builder.WithOrigins("https://your-addin-domain.com") // 替换成你的加载项域名 .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials()); }); - 在
Configure方法中启用CORS(要放在路由配置之前):app.UseCors("AllowAddInOrigin");
2. 调整加载项项目的配置
加载项项目不需要承担令牌验证的工作,只需要完成以下两点:
- 确保加载项的
manifest.xml中WebApplicationInfo配置正确:<WebApplicationInfo> <Id>你的加载项Azure AD应用ID</Id> <Resource>API的应用ID URI</Resource> <Scopes> <Scope>access_as_user</Scope> </Scopes> </WebApplicationInfo> - 在加载项的前端代码中,通过Office.js获取SSO令牌后,将令牌放在请求头的
Authorization字段中传递给API:Office.auth.getAccessToken({ allowSignInPrompt: true }) .then(token => { return fetch('https://your-api-domain.com/api/values', { method: 'GET', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, credentials: 'include' }); }) .then(response => response.json()) .then(data => { // 处理API返回的数据 }) .catch(err => { // 处理令牌获取或API请求错误 });
3. 修正Azure AD应用注册配置
这一步很容易被忽略,直接影响SSO流程的正确性:
- 在API的Azure AD应用注册中,进入暴露API页面,添加加载项的客户端ID作为授权的客户端应用,确保加载项有权限访问API;
- 在加载项的Azure AD应用注册中,进入API权限页面,添加API的
access_as_user权限并完成管理员同意; - 确保两个应用注册的重定向URI分别对应加载项和API的实际域名(加载项的重定向URI用于SSO回调,API的则用于令牌验证的回调)。
4. 常见问题排查
- 如果API返回401未授权:检查API中令牌验证逻辑的受众(
aud)是否匹配API的客户端ID,以及令牌是否过期; - 如果出现跨域错误:确认API的CORS策略是否包含加载项的完整域名(注意http/https的区别),并且开启了
AllowCredentials; - 如果加载项无法获取令牌:检查
manifest.xml的WebApplicationInfo配置是否正确,以及加载项的Azure AD应用是否已获得API的权限。
内容的提问来源于stack exchange,提问作者Gomtesh Hatgine
相关产品推荐
相关产品推荐

