Аутентификация приложения Angular в веб-Api с помощью существующего единого входа с использованием Ping Federate

#asp.net-core-webapi #asp.net-core-3.1 #pingfederate

#asp.net-core-webapi #asp.net-core-3.1 #pingfederate

Вопрос:

У нас есть существующее приложение единого входа с формой входа, которая проверяет подлинность в ping federate.

Я пытаюсь использовать тот же механизм единого входа с angular cli 11.

Я дошел до того, что у меня есть открытый токен, возвращенный из Pingfederate. Что я пытаюсь сделать, мы не настраиваем мой ASP.NET основное приложение, чтобы принять этот токен, проверить его и предоставить мне доступ к утверждениям внутри.

В более старом приложении MVC этот токен расшифровывается с помощью библиотеки opentoken с помощью того, что выглядит как просто пароль.

Как мне настроить мое приложение .net core 3.1 для приема и проверки этого открытого токена?

Вот что у меня есть до сих пор:

 services.AddAuthentication()
            .AddOAuth("urn:ietf:params:oauth:grant-type:saml2-bearer", opt =>
            {
                opt.ClientId = Configuration["PingOpenToken:ClientId"];
                opt.ClientSecret = Configuration["PingOpenToken:ClientSecret"];
            });
 

Где секрет клиента — это тот же пароль, который мы используем для расшифровки токенов. Я не знаю, что должно быть в значении идентификатора клиента.

urn:ietf:params:oauth:grant-type:saml2-bearer Это взято из документации по ping

Я предполагаю, что я собираюсь поместить открытый токен, который у меня есть, в заголовок авторизации as bearer {token} .

И просто чтобы проверить мою конфигурацию pingfederate и посмотреть, нужно ли мне включить что-нибудь еще, в настройках моего протокола у меня есть:

  • Включить сервер авторизации OAuth 2.0: false
  • Поддержка IdP SAML 2.0: верно
  • Поддержка SP SAML 2.0: верно

Если мне нужно включить OAuth 2.0, я понятия не имею, как его настроить.

Комментарии:

1. ОБЯЗАТЕЛЬНО ли использовать адаптер OpenToken? Или вы можете работать с вашим администратором PF, чтобы использовать безагентный адаптер? Безагентный способ проще, браузер выдает вам ссылку, ваше приложение отправляет эту ссылку и секрет приложения в PF, и вы получаете обратно JSON-файл карты атрибутов… Способ проще и с меньшей вероятностью будет нарушен в будущем.

2. К сожалению, предыдущий администратор был уволен, поэтому я вынужден разобраться с этим самостоятельно. Все старые сайты используют этот метод open token через наше приложение единого входа, и, похоже, наша версия PF достаточно старая, и единственное предложение, которое у нас есть, — это open token. У нас есть некоторая библиотека, которая, по-видимому, была написана PF несколько лет назад, которая используется для чтения и записи токенов, но она написана в версии 4.0 и несовместима с core.

Ответ №1:

После разговора с парой человек в PingFederate я понял, как настроить и использовать PF oauth вместо использования их реализации opentoken.

Суть в том, что пользователь отправляется в единый вход, и когда он возвращается в мое приложение angular, он попадает на URL-адрес с токеном. Затем я выполняю обратный вызов API для PF с токеном, чтобы получить их токен oauth.

Затем в моем API у меня есть двойная конфигурация для участника службы Azure ad и PF, подобная этой:

 services.AddAuthentication()
            .AddJwtBearer(ApiConstants.AuthenticationSchemes.AzureBearerToken, opt =>
            {
                opt.Audience = Configuration["AzureAd:ResourceId"];
                opt.Authority = $"{Configuration["AzureAd:Instance"]}{Configuration["AzureAd:TenantId"]}";
                opt.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = false
                };
            })
            .AddJwtBearer(ApiConstants.AuthenticationSchemes.PingBearerToken, opt =>
            {
                opt.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration["PingFederate:JwtIssuer"],
                    ValidAudience = Configuration["PingFederate:JwtAudience"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["PingFederate:JwtSymmetricKey"]))
                };
            });

        services.AddAuthorization(options =>
        {
            options.DefaultPolicy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .AddAuthenticationSchemes(ApiConstants.AuthenticationSchemes.PingBearerToken, 
                    ApiConstants.AuthenticationSchemes.AzureBearerToken)
                .Build();
        });
 

Моими двумя значениями констант являются «azure» и «ping».