将 AddMicrosoftIdentityWebApp 与 IdentityServer4 结合使用是否幸运?

Any luck in using AddMicrosoftIdentityWebApp in combination with IdentityServer4?

我正在尝试将 Microsoft 配置为 Identityserver4 中的外部登录提供程序。 我通过使用 AddMicrosoftAccount:

遵循身份服务器的文档成功
services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
 {
  microsoftOptions.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
  microsoftOptions.ClientId = configuration["MicrosoftLoginProvider:ClientId"];
  microsoftOptions.ClientSecret = configuration["MicrosoftLoginProvider:ClientSecret"];
 });

但是,我没有成功地使用单点注销。该文档与 https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/microsoft-logins?view=aspnetcore-5.0.

处的 Microsoft 文档一致

但是,如果您按照说明在 Microsoft Developer Portal (portal.azure.com) 中创建应用程序,则该门户网站上的示例代码建议使用不同的方法。门户网站为我生成的示例应用程序 (WebApp-OpenIDConnect-DotNet) 使用的是 AddMicrosoftIdentityWebApp:

 services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"));

由于此应用程序开箱即用,包括单点退出,我想知道这是否是我必须继续的方式。

然而,令我惊讶的是,我找不到任何关于如何将这种方法集成到 IdentityServer4 中的 doc/blogs。我自己几乎可以正常工作了,但是有一些奇怪的问题。

有人可以澄清使用 AddMicrosoftIdentityWebApp 是否是将 Microsoft 作为外部身份提供商添加到 Identityserver4 的方法吗? 有人成功让 AddMicrosoftIdentityWebApp 与 IdentityServer4 一起工作吗?

感谢您的帮助!

四处挖掘后,我发现了这条语句 here:

Microsoft.Identity.Web 是在 ASP.NET 核心网络应用程序和网络 API 中使用 Azure AD 的一种更简单的方法。

它不会以任何方式替换 ASP.NET Identity,它不会替换 AddJwtBearerAddCookie 或任何较低级别的基元,但它确实为 Azure AD 使用和配置它们。

它不适用于非 Azure 身份提供者。它取代了 .NET 5.0

中已过时的 AzureAD.UI 和 AzureADB2C.UI

因此,结论是 Microsoft.Identity.Web 在 Azure AD 之外不起作用,因此不适用于 IdentityServer。

如果你真的成功了,请告诉我!

我想出了如何让它发挥作用。

实际上,我只需要做两件事。

首先,我必须在 Microsoft 生成的示例代码中删除对 AddAuthentication 的调用中的 OpenIdConnectDefaults.AuthenticationScheme。所以代码变成:

  services.AddAuthentication()
     .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"));

然后,在从临时 cookie 读取外部身份的代码中,我不得不使用 CookieAuthenticationDefaults.AuthenticationScheme。因此,该代码现在如下所示:

var authenticationResult = await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);

就这些了。