ASP.NET Core Identity Server未认证时如何直接跳转Azure AD登录页
实现跳过Identity Server默认登录页直跳Azure AD的步骤
1. 确认Azure AD认证Scheme配置
首先确认你在服务注册时给Azure AD设置的认证Scheme名称,示例配置如下:
// Program.cs 或 Startup.cs 中的认证服务注册代码 builder.Services.AddAuthentication() .AddOpenIdConnect("AzureAd", "Microsoft 登录", options => { options.Authority = "https://login.microsoftonline.com/你的Azure租户ID/v2.0"; options.ClientId = "你的Azure AD应用客户端ID"; options.ClientSecret = "你的Azure AD应用客户端密钥"; options.ResponseType = "code"; options.SaveTokens = true; // 其余Azure AD配置保持原有逻辑即可 });
上述代码中第一个参数"AzureAd"就是你需要后续用到的Scheme值。
2. 配置Identity Server客户端参数
在你需要跳过默认登录页的客户端配置中,添加DefaultIdentityProvider参数指定为上面的Azure AD Scheme值,可选添加IdentityProviderRestrictions限制仅允许该提供商登录:
// Identity Server 客户端配置代码 new Client { ClientId = "你的业务应用客户端ID", ClientName = "你的业务应用名称", // 其余原有客户端配置(跳转地址、授权类型、作用域等)保持不变 DefaultIdentityProvider = "AzureAd", // 可选配置:禁止该客户端使用其他登录方式 IdentityProviderRestrictions = new List<string> { "AzureAd" } }
如果要让所有客户端都统一直跳Azure AD,不需要逐个配置,可以直接在Identity Server服务注册时全局禁用本地登录,且只注册Azure AD一个外部登录提供商即可。
3. 调整登录入口逻辑(可选兜底配置)
如果上述配置后仍未生效,找到Identity Server自带的AccountController中的Login GET方法,添加判断逻辑直接触发Azure AD认证挑战:
[HttpGet] public async Task<IActionResult> Login(string returnUrl) { var loginViewModel = await BuildLoginViewModelAsync(returnUrl); // 判断仅存在一个可用外部提供商且未开启本地登录时,直接跳转 if (loginViewModel is { EnableLocalLogin: false, ExternalProviders.Count: 1 }) { var aadScheme = loginViewModel.ExternalProviders.First().AuthenticationScheme; return Challenge(new AuthenticationProperties { RedirectUri = Url.Action("Callback", "ExternalLogin", new { ReturnUrl = returnUrl }) }, aadScheme); } // 原有返回登录页的逻辑保留作为降级 return View(loginViewModel); }
注意事项
- 确保
DefaultIdentityProvider的取值和你注册Azure AD时的Scheme完全一致,大小写敏感 - 如果部分客户端需要保留Identity Server默认登录页,只需要给需要直跳Azure AD的客户端单独添加
DefaultIdentityProvider配置即可
内容的提问来源于stack exchange,提问作者Low Chen Thye
相关产品推荐
相关产品推荐

