VS 2022 Teams App如何在启动代码中识别运行环境?
.NET 6+ Teams App 双运行模式适配方法
单套代码即可同时支持Teams托管、独立Web部署两种运行模式,所有分流逻辑在Program.cs的app.Run()调用前完成,不需要维护两套启动项目。
环境判断依据
启动阶段直接读取环境变量做分流,稳定性远高于域名、请求头判断:
- Teams托管场景(含Teams Toolkit本地调试、M365托管部署、应用商店上架运行):工具链和托管环境会自动注入
TEAMS_APP_RUNNING_CONTEXT环境变量,值固定为teamsHosted - 独立Web部署场景:该环境变量不存在,直接走普通Web应用认证逻辑
- 可选兜底:如果需要支持手动部署站点后嵌入Teams作为Tab的场景,补充请求级的Teams标识校验即可
Program.cs 代码示例
var builder = WebApplication.CreateBuilder(args); // 启动时直接读取运行环境标识 bool isTeamsHosted = builder.Configuration.GetValue<string>("TEAMS_APP_RUNNING_CONTEXT")? .Equals("teamsHosted", StringComparison.OrdinalIgnoreCase) ?? false; // 注册所有场景通用的服务 builder.Services.AddRazorPages(); builder.Services.AddControllersWithViews(); // 按运行环境注册对应认证方案 if (isTeamsHosted) { // Teams托管模式:直接用项目模板自带的Teams SSO认证扩展 builder.Services.AddTeamsSSOAuthentication(builder.Configuration); // 配置Teams场景专属授权策略 builder.Services.AddAuthorization(opts => { opts.AddPolicy("TeamsAccess", policy => { policy.RequireAuthenticatedUser(); policy.RequireClaim("tid"); // 强制校验Teams SSO返回的租户ID声明 }); }); } else { // 独立Web模式:替换为你需要的认证方案,Cookie、JWT、第三方OAuth均可 builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(opts => { opts.LoginPath = "/Account/Login"; opts.AccessDeniedPath = "/Account/AccessDenied"; }); // 配置独立Web场景授权策略 builder.Services.AddAuthorization(opts => { opts.AddPolicy("WebAccess", policy => { policy.RequireAuthenticatedUser(); }); }); } var app = builder.Build(); // 注册通用中间件 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 认证授权中间件无需分流,框架会自动匹配前面注册的对应方案 app.UseAuthentication(); app.UseAuthorization(); // 映射路由 app.MapRazorPages(); app.MapDefaultControllerRoute(); // 可选:兜底请求级分流,适配手动部署站点嵌入Teams的场景 app.UseWhen(context => { return context.Request.Headers.ContainsKey("X-Teams-Client-Id") && !isTeamsHosted; }, branch => { branch.UseTeamsSSOMiddleware(); }); app.Run();
注意事项
- 不要用访问域名做环境判断依据,Teams调试、托管环境的域名会随租户、部署槽位变化,判断逻辑极易失效
AddTeamsSSOAuthentication是VS 2022 Teams App模板自带的扩展方法,不需要手动实现,直接调用模板生成的默认逻辑即可- 本地调试切换模式不需要改代码:要跑独立Web模式时,直接在launchSettings.json里删掉
TEAMS_APP_RUNNING_CONTEXT环境变量配置即可 - 独立Web站点如果需要嵌入Teams使用,只需要在CSP配置中添加Teams相关域名白名单,不需要修改认证分流逻辑
内容的提问来源于stack exchange,提问作者ficelles
相关产品推荐
相关产品推荐

