#asp.net-core #authentication #openid-connect
#asp.net-ядро #аутентификация #openid-connect
Вопрос:
Мой ASP.NET Веб-сайт Core 2.2 использует OpenIdConnect для подключения к внешнему поставщику OIDC для аутентификации. Итак, мы получаем перенаправление на провайдера, вы входите в систему, он возвращается обратно на сайт. Все это обрабатывается на стороне сервера и отлично работает.
Наш веб-сайт использует javascript для связи с серверной частью API, которая украшена атрибутом [Authorize].
Теперь мы хотим поделиться нашим API с другим приложением. У меня возникли проблемы с пониманием того, как заставить его работать с существующим поставщиком OpenIdConnect. Если я использую Postman для совершения вызова, я добавляю токен на предъявителя, но мне возвращается экран входа в систему для моего поставщика OIDC. Я понимаю это, он настроен для OIDC.
Я пробовал использовать AddJwtBearer с помощью [Authorize(AuthenticationSchemes = JwtBearerDefaults .AuthenticationScheme)] устанавливается на моем контроллере, и когда я это делаю, я могу успешно передать токен на предъявителя и вызвать свой API из Postman, но я не могу выполнить вызов со страницы javascript на моем сайте.
Итак, главный вопрос в том, как мне настроить этот сайт, чтобы я мог вызывать API с самого своего сайта с помощью OIDC, а также вызывать из внешнего приложения, используя токен-носитель?
Код выглядит следующим образом:
public void ConfigureServices(IServiceCollection services)
{
var authbuilder = services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
});
authbuilder.AddCookie(p =>
{
p.SlidingExpiration = true;
p.Events.OnSigningIn = (context) =>
{
context.CookieOptions.Expires = DateTimeOffset.UtcNow.AddHours(14);
return Task.CompletedTask;
};
});
authbuilder.AddOpenIdConnect(options =>
{
options.Authority = Configuration["OpenIdConnectSettings:AuthorityUrl"];
options.ClientSecret = Configuration["OpenIdConnectSettings:ClientSecret"];
options.ClientId = Configuration["OpenIdConnectSettings:ClientId"];
}
options.SaveTokens = true;
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
options.GetClaimsFromUserInfoEndpoint = true;
options.Events = new OpenIdConnectEvents
{
OnTokenValidated = context =>
{
// validation logic omitted
}
РЕДАКТИРОВАТЬ: Любые внешние приложения также будут использовать того же поставщика OIDC. Это просто вопрос того, чтобы заставить мои контроллеры API работать с самого веб-сайта и вызываться из другого приложения, которое использует того же поставщика OIDC.
РЕДАКТИРОВАТЬ: я думаю, что, возможно, я заставил его работать, добавив этот код:
services.AddAuthorization(options =>
{
var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
JwtBearerDefaults.AuthenticationScheme, OpenIdConnectDefaults.AuthenticationScheme);
defaultAuthorizationPolicyBuilder = defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
});
Ответ №1:
если другое приложение является сервисом / приложением (а не клиентом, ориентированным на пользователя), то это приложение должно зарегистрироваться в качестве клиента у вашего поставщика OIDC, а затем предпочтительно использовать поток учетных данных клиента, чтобы получить токен от вашего поставщика OIDC и передать его в API.
API доверяет токенам доступа только от вашего поставщика OIDC (эмитента токена), поэтому приложению необходимо пройти аутентификацию в приложении и получить надлежащий токен доступа.