如何在同一.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
相关产品推荐
相关产品推荐

