Совместное использование аутентификации OpenIdConnect и JwtBearer

#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 (эмитента токена), поэтому приложению необходимо пройти аутентификацию в приложении и получить надлежащий токен доступа.