Я использую комбинацию IdentityServer4 и ASP .NET Core Identity для создания федеративной страницы входа.Одним из внешних провайдеров, которым я пользуюсь, является Azure Active Directory через протокол Open ID Connect.Я также интегрировал EntityFrameworkCore для всего моего хранения данных.
После того, как я создал свой первоначальный веб-сайт с аутентификацией Identity, я добавляю соответствующие сервисы в мой файл 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)
});
Я решил, что это будет выглядеть лучше, если я выполню большую часть своей аутентификацииsetup в моем 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 автоматически появляется на странице входа.Smashing!При попытке использовать это, меня приветствует ошибка: Error loading external login information.
В конце концов, на странице лесов Razor 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
, или какая-то магия, которую не удосужилась упомянуть ни одна документация.