. Net Core 3.1 OpenIdConnect с AWS Cognito - PullRequest
1 голос
/ 28 февраля 2020

Я пытался заставить AWS Инкогнито работать с ASP. NET Core 3.1 весь день, и мне не хватает одной важной части.

Код ниже близок, потому что:

Это будет

  • Пусть пользователь go через встроенный ASP . NET Страницы регистрации и входа в систему для учетных записей пользователей
  • Это приведет к тому, что для пользователя появятся записи как в таблице AspNetUsers, так и в таблице AspNetUserLogins.
  • Появляются в журнале пользователь, когда они проходят через ASP. Net Identity UI ExternalLogin.cshml Метод обратного вызова страницы: enter image description here

  • Но в действительности ASP. Net Личность этого пользователя не известна enter image description here

  • Кроме того, это приведет к бесконечному l oop, если вы попытаетесь получить доступ к авторизованная страница, переадресация между запрашиваемой страницей, сервером AWS Cognito и встроенным маршрутом "signin-oid c".

enter image description here

Подозреваемая строка больше всего:

options.SignInScheme = IdentityConstants.ExternalScheme;

Как отмечают комментарии кода, комментирование этой строки нарушит встроенную регистрацию, но решить инфини tel oop проблема (а также пусть openid заявляет, что готовит ie оставайтесь заполненными).

Довольно ясно, что это close , но есть кое-что не совсем связанное, чтобы привести это все вместе.

var awsCognitoRegion = "us-east-1";
var awsCognitoPoolId = "******";
var metaDataAddress = $"https://cognito-idp.{awsCognitoRegion}.amazonaws.com/{awsCognitoPoolId}/.well-known/openid-configuration";
//var awsCognitoResponseType = "code";
var awsCognitoMetaAddress = metaDataAddress;
var awsCognitoClientId = "*******************";
var awsCognitoSecret = "**********************";

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    //fixes "Error loading external login information" error on Identity Login page / callback
    //after external login...but breaks identity/cookie/claims?
    //
    //Also Causes infinite redirect problem via signin-oidc
    options.SignInScheme = IdentityConstants.ExternalScheme;

    //show all claims since MS filters some out...
    options.ClaimActions.Clear();

    //Tell .Net Core identity where to find the "name"
    //options.TokenValidationParameters.NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress";
    options.TokenValidationParameters.NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier";

    options.ResponseType = "code";
    options.MetadataAddress = metaDataAddress;
    options.ClientId = awsCognitoClientId;
    options.ClientSecret = awsCognitoSecret;

    options.SaveTokens = true;
    options.GetClaimsFromUserInfoEndpoint = true;

    //I think all I need here is email
    options.Scope.Add("email");
    options.Scope.Add("profile");
    options.Scope.Add("openid");
    //options.Scope.Add("aws.cognito.signin.user.admin");
});

1 Ответ

0 голосов
/ 28 февраля 2020

Поскольку эти аутентификационные функции всегда выполняются, в итоге одно свойство отсутствует / установлено неправильно.

В этом случае SigninManager проверял, имеет ли удостоверение значение principal.Identities.Any(i => i.AuthenticationType == IdentityConstants.ApplicationScheme); (* 1005). *). Вот почему, хотя у Identity было бы IsAuthentictated = true, встроенные ASP. Net страницы идентификаторов были сломаны, потому что это значение было установлено на AuthenticationTypes.Federation.

. обнаружил, что в опциях метода .AddOpenIdConnect есть способ установить следующее:

options.TokenValidationParameters.AuthenticationType = IdentityConstants.ApplicationScheme;

Это, наконец, позволило ASP. Net Удостоверение личности, что я вошел в систему (через OpenId).

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