Skip to main content

Teams Bot App 集成SSO 认证

分类:  Teams应用开发 标签:  #Teams App #编程 #.Net 发布于: 2025-02-16 19:58:38

最近在开发一个基于TeamsBot应用,使用官方文档进行SSO集成认证时遇到了各种问题,最后经历了各种测试以及咨询终于把基于TeamsSSO认证解决了,留一个记录保存。

什么是SSO

SSO 是 Single sign-on的缩写。在Teams的应用中,使用用户已经在登录Teams时认证后得到的标识认证Teams bot应用的用户, 从而完成认证。

前置条件说明

要集成TeamsSSO,还是有前置条件的,首先Microsoft 365Tenant和部署Azure Bot ServiceTenant应该是一个,另外用户需要创建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, 开始选择资源创建。

创建时注意事项:

  1. 注意Bot handle, 请选择符合规则的字符用于Bot handle的值:



  2. 注意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 IdApp管理界面,然后我们开始配置

  1. 配置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) 都勾选上,然后保存。

其他的配置不变。

  1. 配置必要的权限

继续选择菜单Manage -> API Permissions, 注意在这里配置权限有可能需要管理员来帮助你Grant Admin consent, 不过我们这里仅仅是为了SSO, 因此我们在配置权限的时候,仅仅选择openidprofileUser.Read

在界面上选择Add a permission, 然后选择 Microsoft Graph -> Delegated permissions, 然后在搜索框里搜索上述三个权限,并赋予该App, 上述三个权限一般情况都不需要Admin帮助你Grant

  1. 为该App公开API

继续选择菜单Manage -> Expose an API, 在出现的界面上,如下图,选择Add:

选择Add之后会弹出一个设定Application ID URI的窗口,如下图:

这里特别需要注意:

  1. 如果你的应用只是一个bot App, 那么application ID URI的格式为:api://botid-{your Application id},千万别忘了这个botid, 另外{your Application id}记得替换。

  2. 如果你的应用是一个Teams多种类型的应用,例如包括tabbot等,那么你的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的所有步骤都配置完成了。

不过别忘了,要从菜单重新生成一下该AppSecurity, 菜单路径 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 appmainfest里一定要将域名:token.botframework.com 填到teams appConfigure -> 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.

至此配置全部完成,我遇到的几个坑如下:

  1. 配置中遇到Tenant Id 不知道该填什么,重申一下如果是multiteant类型,填common, 如果是single tenant 填对应的id

  2. 在teams app里忘了将域名token.botframework.com填到validDomains里。

  3. 不知道Application ID URI的正确格式。