Teams Bot App 集成SSO 认证
分类: Teams应用开发 ◆ 标签: #Teams App #编程 #.Net ◆ 发布于: 2025-02-16 19:58:38
最近在开发一个基于Teams的Bot应用,使用官方文档进行SSO集成认证时遇到了各种问题,最后经历了各种测试以及咨询终于把基于Teams的SSO认证解决了,留一个记录保存。
什么是SSO
SSO 是 Single sign-on的缩写。在Teams的应用中,使用用户已经在登录Teams时认证后得到的标识认证Teams bot应用的用户, 从而完成认证。
前置条件说明
要集成Teams的SSO,还是有前置条件的,首先Microsoft 365的Tenant和部署Azure Bot Service的Tenant应该是一个,另外用户需要创建Azure Bot Service的时候留意选择的Bot应用的类型,是基于MultiTenant还是Single Tenant。另外在创建Bot Service的时候,可以预先创建好Microsoft Entra Id或者在创建Bot Service的时候,让Bot Service自己创建一个Microsoft Entra Id, 本例中我们让Bot Service自行创建App。
创建Bot Service
登录到Azure Portal之后,选择Create, 然后搜索Azure Bot, 开始选择资源创建。
创建时注意事项:
注意
Bot handle, 请选择符合规则的字符用于Bot handle的值:

注意
Type of App:

注意这里的值可以选择Multi Tenant或者Single Tenant, 这里选择这两个值会影响到之后的SSO配置。
在创建Azure Bot的过程中这两个地方需要注意,其他的地方就常规创建就好了。
在Microsft Entra Id中配置SSO
在Azure Bot Service创建完成了之后,我们可以开始在Microsoft Entra Id中配置SSO了。
在Azure Portal中找到刚刚创建的Bot Service的实例,进入该资源的管理界面之后,点击左边的菜单Settings -> Configuration, 然后选择下图中的Manage Password:

点击该链接之后会跳到Micrsoft Entra Id的App管理界面,然后我们开始配置
配置
App的平台
在Microsoft Entra Id该应用的管理界面,选择左侧菜单Manage -> Authentication, 在出现的界面里选择Add a platform, 然后选择Web, 如下图:
选择Web之后,在新的界面中,Redirect Url一定要填上地址:https://token.botframework.com/.auth/web/redirect, 同时注意选项Select the tokens you would like to be issued by the authorization endpoint:, 必须将两个选项Access tokens (used for implicit flows) 和 ID tokens (used for implicit and hybrid flows) 都勾选上,然后保存。
其他的配置不变。
配置必要的权限
继续选择菜单Manage -> API Permissions, 注意在这里配置权限有可能需要管理员来帮助你Grant Admin consent, 不过我们这里仅仅是为了SSO, 因此我们在配置权限的时候,仅仅选择openid, profile, User.Read。
在界面上选择Add a permission, 然后选择 Microsoft Graph -> Delegated permissions, 然后在搜索框里搜索上述三个权限,并赋予该App, 上述三个权限一般情况都不需要Admin帮助你Grant。
为该
App公开API
继续选择菜单Manage -> Expose an API, 在出现的界面上,如下图,选择Add:
选择Add之后会弹出一个设定Application ID URI的窗口,如下图:

这里特别需要注意:
如果你的应用只是一个bot App, 那么
application ID URI的格式为:api://botid-{your Application id},千万别忘了这个botid, 另外{your Application id}记得替换。如果你的应用是一个
Teams多种类型的应用,例如包括tab,bot等,那么你的Application id URI格式应该是:api://{你的部署域名}/botid-{your Application id}, 这里需要解释一下你的部署域名是指你写好了代码之后,要部署到一个web应用中使用的域名,如果你是使用ngrok在测试和开发的时候使用临时域名,那么每次测试和开发的时候,启动停止ngrok的时候生成新的域名都需要重新配置这个地方。
如果仅仅是bot应用,那么直接使用格式api://botid-{your Application Id}
按照格式填写好application id uri之后,保存,回到之前的界面。
然后我们继续为这个api定义它的scope, 在如下图中点击Add a scope:

填好后,点击Add scope按钮保存
然后选择Add a client Application, 如下图:

在出现的界面上,填入如下两个Application Id:
1fec8e78-bce4-4aaf-ab1b-5451cc387264, 这个是Teams移动版和桌面版的Id。5e3ce6c0-2b1f-4285-8d4b-75ee78787346, 这个是Web版的Teams。
注意这里必须要把如下图的选择框勾选:

到这里在Micrsoft Entra Id的所有步骤都配置完成了。
不过别忘了,要从菜单重新生成一下该App的Security, 菜单路径 Manage-> Certificates & Secrets, 新添加一个secrets就好了,要把新生成的sectets记下来,它只显示一次。
在Azure Bot Service这一侧配置SSO Connection
我们需要再次回到Azure Bot Service的资源,选择菜单Settings -> Configuration, 选择按钮Add OAuth Connection Settings, 在新界面里设置一个新的名字,然后Service Provider选择Azure Active Directory V2, 同时按照要求填写如下字段:
Client id: 填写创建Azure Bot Service自动生成的Application id, 可以在Manage->Configuration的界面里Microsoft App ID, 找到该信息。Client Secret: 还记得上个步骤最后要求生成的Secret么?填这个Token Exchange URL: 当作为SSO的时候,这里填之前生成的application id uri, 这种形式的:api://botid-{your application id}Tenant Id, 如果在创建bot的时候选择了Single Tenant, 那么这里填实际的Tenant id, 类似client id的一长串字符,如果是选择了MultiTenant, 那么注意,这里是填的单词common, 注意是单词commonScopes, 这里为了SSO, 可以根据你自己的需要填,但是为了登录测试,填:openid profile User.Read
最后保存。
保存之后,观察到该资源添加好了之后,可以再次点开,看到一个Test Connection, 先测试一下是否可以正常的拿到Token, 如果可以正常拿到那说明这里配置已经全部都没有问题了。
配置Teams App
这里有一个非常重要的点,在开发teams app的时候除了常规的在mainfest里填写必要的bot id之外,要有一个非常重要的点是在teams app的mainfest里一定要将域名:token.botframework.com 填到teams app的Configure -> Domain里(在teams的Developer Portal), 如果是在mainfest里注意字段validDomains里,如:
"validDomains": [
"*.ngrok-free.app",
"*.azurewebsites.net",
"token.botframework.com"
],
配置应用
应用的代码可以参考:https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-conversation-sso-quickstart/csharp_dotnetcore/BotConversationSsoQuickstart
但是注意配置文件:appsettings.json:
"MicrosoftAppId": "{TODO: MicrosoftAppId}",
"MicrosoftAppPassword": "{TODO: ClientSecret}",
"ConnectionName": "{TODO: ConnectionName}",
"MicrosoftAppType": "MultiTenant", // Set this to SingleTenant if you are using a single tenant app registration
"MicrosoftAppTenantId": "common" // Set your tenantId here if you are using single tenant app registration.
至此配置全部完成,我遇到的几个坑如下:
配置中遇到
Tenant Id不知道该填什么,重申一下如果是multiteant类型,填common, 如果是single tenant填对应的id在teams app里忘了将域名
token.botframework.com填到validDomains里。不知道
Application ID URI的正确格式。