AspNet Core Identity GetExternalLoginInfoAsync Always Null



我正在使用IdentityServer4和ASP .NET Core Identity的组合来创建联合登录页面。我正在使用的外部提供商之一是通过Open ID Connect协议的Azure Active Directory。我还为我所有的数据存储集成了EntityFrameworkCore。

使用身份验证搭建初始网站的基架后,我将相应的服务添加到我的Startup.cs文件中。

services.AddOidcStateDataFormatterCache();
// Some DI registrations
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<MyDbContext>();
services.AddMvc().AddRazorPages(options => /* Some options */);
services.AddIdentityServer(options =>
options.Events.RaiseErrorEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseInformationEvents = true;
options.Events.RaiseSuccessEvents = true;
)
.AddConfigurationStore(options => /* Set up DbContext */)
.AddOperationStore(options => /* Set up DbContext */)
.AddAspNetIdentity<MyAppUser>();
services.AddAuthentication().AddOpenIdConnect(options =>
{
// Does not bind itself for mysterious reasons
Configuration.GetSection("OpenIdConect").Bind(options)
});

我决定如果我在appsettings.json文件中进行大部分身份验证设置,看起来会更好。

{
"OpenIdConnect": {
"ClientId": "<my_client_id>",
"Authority:" "https://login.microsoft.com/<my_tenant_id>",
"PostLogoutRedirectUri": "http://localhost:5000/MyApp/Account",
"CallbackPath": "/signin-oidc",
"ResponseType": "code id_token",
"Scope": "openid profile email",
"SignInScheme": "idsrv.external",
"AutomaticAuthenticate": "false",
"AutomaticChallenge": "false",
"RequireHttpsMetadata": "true"
}
}

一切都运行,我的 Open ID Connect 登录提供程序会自动出现在登录页面上。砸!尝试使用它时,我遇到了一个错误:Error loading external login information.最终出现在脚手架剃刀页面上Areas/Identity/Pages/Account/ExternalLogin.cshtml.cs:72有这段代码:

var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
ErrorMessage = "Error loading external login information.";
return RedirectToPage("./Login", new { ReturnUrl = returnUrl });
}

info始终解析为空。我怀疑这是我Startup.cs某处的配置问题,或者是一些没有文档费心提及的魔法。

在读完我的大脑后,我决定重读有关外部身份提供程序的 IdentityServer4 文档。

这引起了我(疲惫的)注意:

鉴于这是一种常见的做法,IdentityServer 专门为此外部提供程序工作流注册了一个 Cookie 处理程序。该方案通过IdentityServerConstants.ExternalCookieAuthenticationScheme恒定。

如果您要使用我们的外部 cookie 处理程序,则对于 SignInScheme(在您的 OpenIdConnect 服务设置中),您需要将值指定为IdentityServerConstants.ExternalCookieAuthenticationScheme常量

好吧,我想我没有使用他们的外部 cookie 处理程序。很确定我让ASP .NET Core Identity这样做。我决定在我的appsettings.json中杀死这一行:

"SignInScheme": "idsrv.external"

看哪,我可以使用我的Active Directory凭据登录。阅读GetExternalLoginInfoAsync的实际源代码,我看到他们正在寻找一个非常具体的cookie,它不是"idsrc.external"。将其保留为默认值是我需要的。

相关内容

  • 没有找到相关文章

最新更新