#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».