Основная идентификация AspNet GetExternalLoginInfoAsync Всегда пусто - PullRequest
3 голосов
/ 19 апреля 2019

Я использую комбинацию 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, или какая-то магия, которую не удосужилась упомянуть ни одна документация.

1 Ответ

2 голосов
/ 19 апреля 2019

Прочитав мои мозги, я решил перечитать документацию 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".Оставить его по умолчанию было то, что мне было нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...