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
, 注意是单词common
Scopes
, 这里为了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
的正确格式。