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

如何在同一.NET Core应用中同时支持Microsoft Account与ADFS身份验证

实现多身份验证方案动态切换的步骤

1. 新增appsettings配置项

首先在appsettings.json中新增两个配置节点:一是全局的启用方案标记,二是ADFS对应的可配置参数,避免硬编码:

{
  "Authentication": {
    // 可选值:MicrosoftAccount / WsFederation
    "EnabledScheme": "MicrosoftAccount",
    "Microsoft": {
      "ApplicationId": "你的微软应用ID",
      "Password": "你的微软应用密钥",
      "OAuth": "微软授权端点",
      "Token": "微软令牌端点"
    },
    "WsFederation": {
      "MetadataAddress": "你的ADFS元数据地址",
      "Wtrealm": "你的ADFS依赖方标识符"
    }
  }
}

2. 改造Startup.cs的认证注册逻辑

原有代码不需要全部删除,调整为根据配置动态加载对应方案,同时指定默认认证方案即可:

// 先读取配置中指定的启用方案
var enabledAuthScheme = Configuration["Authentication:EnabledScheme"];

services.AddAuthentication(options =>
{
    // 把默认的挑战、认证、登出方案都设置为配置中指定的方案
    options.DefaultAuthenticateScheme = enabledAuthScheme;
    options.DefaultChallengeScheme = enabledAuthScheme;
    options.DefaultSignOutScheme = enabledAuthScheme;
})
.AddMicrosoftAccount(microsoftOptions =>
{
    microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ApplicationId"];
    microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:Password"];
    microsoftOptions.AuthorizationEndpoint = Configuration["Authentication:Microsoft:OAuth"];
    microsoftOptions.TokenEndpoint = Configuration["Authentication:Microsoft:Token"];
    microsoftOptions.CallbackPath = new PathString("/auth/callback");
    microsoftOptions.UsePkce = false;
})
.AddWsFederation(options =>
{
    options.MetadataAddress = Configuration["Authentication:WsFederation:MetadataAddress"];
    options.Wtrealm = Configuration["Authentication:WsFederation:Wtrealm"];
    // 单独配置ADFS的回调路径,避免和微软账户回调冲突
    options.CallbackPath = new PathString("/signin-wsfed");
});

3. 可选适配(多方案同时提供登录入口场景)

如果部分客户需要同时提供两种登录方式选择,不需要设置全局默认方案,只要在登录接口给不同的登录入口指定对应的挑战方案即可:

// 微软账户登录接口
public IActionResult SignInMicrosoft()
{
    return Challenge(new AuthenticationProperties { RedirectUri = "/" }, "MicrosoftAccount");
}

// ADFS登录接口
public IActionResult SignInAdfs()
{
    return Challenge(new AuthenticationProperties { RedirectUri = "/" }, "WsFederation");
}

注意事项

  • 两种认证方案的回调路径不要重复,避免认证回调时匹配错误
  • 生产环境中敏感配置(比如密钥、ADFS地址)建议用密钥管理器或者环境变量存储,不要明文写在appsettings中
  • Configure方法中保留UseAuthentication、UseAuthorization中间件的顺序即可,不需要额外修改其他授权校验逻辑

内容的提问来源于stack exchange,提问作者Andrew Casey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:57:05