我正在尝试将 Microsoft 配置为 Identityserver4 中的外部登录提供程序。 我通过使用
AddMicrosoftAccount
: 遵循身份服务器的文档成功了
services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
{
microsoftOptions.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
microsoftOptions.ClientId = configuration["MicrosoftLoginProvider:ClientId"];
microsoftOptions.ClientSecret = configuration["MicrosoftLoginProvider:ClientSecret"];
});
但是,我没有运气让单点退出工作。该文档与 Microsoft 的文档一致,网址为 https://learn.microsoft.com/en-us/aspnet/core/security/authentication/social/microsoft-logins?view=aspnetcore-5.0。
但是,如果您按照 Microsoft 开发人员门户 (portal.azure.com) 中的说明创建应用程序,该门户上的示例代码会建议采用不同的方式。门户为我生成的示例应用程序 (WebApp-OpenIDConnect-DotNet) 正在使用
AddMicrosoftIdentityWebApp
:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"));
由于此应用程序是开箱即用的,包括单点退出,我想知道这是否是我必须继续的方式。
然而,令我惊讶的是,我找不到任何有关如何在 IdentityServer4 中集成此方法的文档/博客。我自己几乎可以正常工作了,但是有一些奇怪的问题。
有人可以澄清一下使用
AddMicrosoftIdentityWebApp
是否是将 Microsoft 添加为 Identityserver4 的外部身份提供商的方法吗?
有人成功让 AddMicrosoftIdentityWebApp
与 IdentityServer4 一起使用吗?
感谢您的帮助!
我想出了如何让它发挥作用。
实际上,我只需要做两件事。
首先,我必须在 Microsoft 生成的示例代码中删除对
OpenIdConnectDefaults.AuthenticationScheme
的调用中的 AddAuthentication
。所以代码就变成了:
services.AddAuthentication()
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"));
然后,在从临时 cookie 读取外部身份的代码中,我必须使用 CookieAuthenticationDefaults.AuthenticationScheme。因此,该代码现在如下所示:
var authenticationResult = await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
仅此而已。
经过一番挖掘,我发现了这个说法here:
Microsoft.Identity.Web 是在 ASP.NET Core Web 应用程序和 Web API 中使用 Azure AD 的更简单方法。
它不会以任何方式替换 ASP.NET Identity,它不会替换 AddJwtBearer 或 AddCookie 或任何较低级别的原语,但它确实为 Azure AD 正确使用和配置它们。
它不适用于非 Azure 身份提供商。它取代了 .NET 5.0 中已过时的 AzureAD.UI 和 AzureADB2C.UI
因此,结论是 Microsoft.Identity.Web 无法在 Azure AD 之外运行,因此无法与 IdentityServer 一起运行。
如果你确实让它工作,请告诉我!
默认情况下,Identity Server 的 Quickstart UI 捆绑包附带的
ExternalController
会读取名称为“adsrv.external”的身份验证 cookie
// read external identity from the temporary cookie
var result = await HttpContext.AuthenticateAsync(IdentityServerConstants.ExternalCookieAuthenticationScheme);
但是对于
AddMicrosoftIdentityWebApp
,默认 cookie 名称是“Cookie”。 OP 通过将 ExternalController
中的回调方法更改为 HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme)
的解决方法有效。但是,如果您已经有其他身份验证方案都使用 ExternalCookieAuthenticationScheme
作为登录方案,那么显然想法方法是使 AddMicrosoftIdentityWebApp
相同。
这可以通过在配置
SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme
时设置 MicrosoftIdentityOptinos
来完成。 cookieScheme
可选参数还需要明确设置为null
或空字符串,否则它将注册自己的cookie处理程序而不是使用ExternalCookieAuthenticationScheme