.NET Core WebAPI 中使用 MISE + S2S 的三种方式

.NET Core WebAPI 中使用 MISE + S2S 的三种方式

在 .NET Core WebAPI 中集成 MISE (Microsoft Identity Service Endpoint) 与 S2S (Service-to-Service) 认证授权时,常见有三种写法。本文将分别介绍它们的用法、配置方式,并在最后进行对比。


方式一:AddMicrosoftIdentityWebApi

用法

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAd"));

配置示例

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "ClientId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "Audience": "api://your-api-app-id"
  }
}

特点

  • 通用的 Azure AD 集成方式,支持用户登录和 S2S 场景。

  • 需要手动配置 Issuer、Audience 等。

  • 灵活度高,可自定义授权策略。

方式二:AddAuthentication(S2SAuthenticationDefaults.AuthenticationScheme).AddMiseWithDefaultModules

用法

services.AddAuthentication(S2SAuthenticationDefaults.AuthenticationScheme)
    .AddMiseWithDefaultModules(Configuration);

配置示例

{
  "Mise": {
    "TenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "ClientId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "Audience": "api://your-api-app-id",
    "Authority": "https://login.microsoftonline.com/"
  }
}

特点

  • 专门针对 S2S 场景的封装。

  • 自动绑定配置并附加默认模块:

  • Token 验证模块

  • 日志模块

  • 健康检查模块

  • 缓存模块

  • 开箱即用,减少手工配置。

方式三:AddS2SAuthentication + AddMise + EnableTokenAcquisition

用法

builder.AddS2SAuthentication(S2SAuthenticationDefaults.AuthenticationScheme, config);

builder.Services
    .AddMise(config, options.ClientId)
    .EnableTokenAcquisitionToCallDownstreamApiAndDataProviderAuthentication(
        S2SAuthenticationDefaults.AuthenticationScheme)
    .AddInMemoryTokenCaches();

配置示例

{
  "Mise": {
    "TenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "ClientId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "ClientSecret": "your-client-secret",
    "Audience": "api://your-api-app-id",
    "Authority": "https://login.microsoftonline.com/"
  }
}

特点

  • 同时完成 入站 Token 验证 和 出站 Token 获取。

  • 支持调用下游 API(如 Microsoft Graph)。

  • 内置 Token 缓存机制,提升性能。

  • 更适合微服务场景:既能被调用,又能调用其他服务。

📊 三种方式的差异对比

方式 配置绑定 Token 验证 默认模块 下游 API 调用 缓存支持 适用场景
AddMicrosoftIdentityWebApi 手动绑定 AzureAd 通用场景(用户登录 + S2S)
AddMiseWithDefaultModules 自动绑定 Mise 配置 ✅ 日志/健康检查/缓存 ✅ 默认缓存 专注 S2S,开箱即用
AddS2SAuthentication + AddMise 手动 + 自动结合 可扩展 ✅ 支持下游调用 ✅ 可选缓存 微服务场景,既入站又出站

🔑 总结

  • 方式一:通用,灵活,适合用户登录和简单的 S2S。

  • 方式二:专注 S2S,自动附加模块,开箱即用。

  • 方式三:最完整,既能验证入站 Token,又能获取下游 Token,支持缓存,适合复杂微服务架构。

仔细介绍

  • services.AddAuthentication(S2SAuthenticationDefaults.AuthenticationScheme)这个只是注册了一个Auth 的schema, 但是缺乏验证token的逻辑。如果不用上面的MISE,我们需要手动提供token验证的方式。下面是手动的方式
services.AddAuthentication(S2SAuthenticationDefaults.AuthenticationScheme)
        .AddJwtBearer(S2SAuthenticationDefaults.AuthenticationScheme, options =>
        {
            options.Authority = "https://login.microsoftonline.com/{tenantId}/v2.0";
            options.Audience = "api://your-api-app-id";

            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidIssuer = $"https://login.microsoftonline.com/{tenantId}/v2.0",
                ValidateAudience = true,
                ValidAudience = "api://your-api-app-id",
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true
            };
        });
posted @ 2025-12-07 10:49  kongshu  阅读(7)  评论(0)    收藏  举报