问题描述
我有一个基于IdentityServer4核心1.0的应用程序。它与Azure AD进行了有效的集成。然而,在将项目迁移到IdentityServer42.0.0-rc1之后,集成不再起作用。这与从.NET Core1.0到Core2.0的破坏性更改有关。我遵循https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x
的建议我尝试将app.UseOpenIdConnectAuthentication
调用更改为
services.AddAuthentication() .AddMicrosoftAccount(...)
或至
services.AddAuthentication() .AddOpenIdConnect(...)
_httpContextAccessor.HttpContext.Authentication.GetAuthenticationSchemes()
,用于构建外部认证服务。有人知道再次启用Azure AD集成的正确方式吗?
推荐答案
经过一番研究,我想通了。重要的是,您不应该再依赖过时的调用:_httpContextAccessor.HttpContext.Authentication.GetAuthenticationSchemes()
。相反,您应该调用await _schemaProvider.GetAllSchemesAsync()
,其中_schemaProvider是IAuthenticationSchemeProvider的注入接口。另一个更改是在Startup.cs ConfigureServices中,您应该像这样构建外部身份验证提供程序:
services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = "[custom name]" }) .AddCookie() .AddOpenIdConnect("[custom name]", options => { options.Authority = $"https://login.microsoftonline.com/[tenantid]"; options.ClientId = [client id]; });
注意:我将一个名称作为第一个参数传递给AddOpenIdConnect,它将为该实例提供一个定制方案名称。这有助于在登录页面上显示外部提供程序,因为我还没有弄清楚如何传递DisplayName。如果不进行此更改,它将显示‘OpenIdConnect’。如果我有许多AAD集成,我认为这太通用和混乱了。由于此方案更改,您还需要确保将选项.DefaultChallengeSolutions设置为您添加的方案名称。
这篇关于如何在用于Core 2.0的IdentityServer4中启用Azure集成?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!