You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:36:15