Почему Openiddict автоматически проверяет client_id? - PullRequest
0 голосов
/ 06 января 2019

Я хочу сгенерировать токен с четырьмя параметрами client_id, client_secret, username & user password. Client_Id и client_secret являются необязательными требованиями. Когда я генерирую токен с именем пользователя и паролем пользователя, он работает нормально, но когда я пытаюсь передать client_id, он завершается с 500 внутренней ошибкой сервера.

Когда я проверяю журнал и обнаружил:

Для этого DbContext не настроен поставщик базы данных.

Конфигурация моей службы

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddDbContext<DbContext>(options =>
        {
            options.UseOpenIddict();
        });

        services.AddOpenIddict()
            // Register the OpenIddict core services.
            .AddCore(options =>
            {
                options.UseEntityFrameworkCore().UseDbContext<DbContext>();
            })

            .AddServer(options =>
            {
                options.UseMvc();
                options.EnableTokenEndpoint("/connect/token");
                options.AllowPasswordFlow().AllowRefreshTokenFlow();
                options.SetAccessTokenLifetime(TimeSpan.FromMinutes(10));
                options.SetRefreshTokenLifetime(TimeSpan.FromHours(4));
                options.AcceptAnonymousClients();
                options.DisableHttpsRequirement();

            })
            .AddValidation();
        services.AddAuthentication(options =>
        {
            options.DefaultScheme = OpenIddictValidationDefaults.AuthenticationScheme;
        });
    }

LOG

  fail: Microsoft.AspNetCore.Server.Kestrel[13]
  Connection id "0HLJJPK2L74A1", Request id "0HLJJPK2L74A1:00000003": An 
  unhandled exception was thrown by the application.
  System.InvalidOperationException: No database provider has been 
  configured for this DbContext. A provider can be configured by 
  overriding the DbContext.OnConfiguring method or by using AddDbContext 
  on the application service provider. If AddDbContext is used, then also 
  ensure that your DbContext type accepts a DbContextOptions<TContext> 
  object in its constructor and passes it to the base constructor for 
  DbContext.


  at System.Threading.Tasks.ValueTask`1.get_Result()
  at 
  OpenIddict.Core.OpenIddictApplicationManager`1.FindByClientIdAsync(String 
  identifier, CancellationToken cancellationToken)
  at OpenIddict.Core.OpenIddictApplicationManager`1. 
  OpenIddict.Abstractions.IOpenIddictApplicationManager. 
  FindByClientIdAsync(String identifier, CancellationToken 
  cancellationToken)

Проблема в том, что это происходит только тогда, когда я передаю client_id по запросу токена. Я думаю, что client_Id автоматически проверяется openiddict. Я хочу проверить этот client_id с помощью моего метода / connect / token.

Я не настраиваю никакой dbcontext в моем приложении. Там в любом случае сгенерировать токен с помощью client_id & client_secret & id пользователя & User Pass без настройки ниже строки или есть какая-либо другая конфигурация для этого

  .AddCore(options =>
            {
                options.UseEntityFrameworkCore().UseDbContext<DbContext>();
            })

Я использую базу данных Oracle для своего приложения.

1 Ответ

0 голосов
/ 09 января 2019

Client_Id и client_secret являются необязательными требованиями.

Это: общедоступный клиент действительно может избежать отправки своего идентификатора клиента, что разрешено спецификацией OAuth2. Если вы настроили OpenIddict для отключения требования идентификации клиента (применяется по умолчанию), запрос будет считаться действительным, если client_id отсутствует.

Тем не менее, если вы укажете client_id, то он ДОЛЖЕН соответствовать реальному приложению. OpenIddict проверяет это, запрашивая базовое хранилище (EF Core в вашем случае), существует ли приложение с указанным client_id. Если поставщик БД настроен неправильно, вы получите исключение, подобное тому, которое вы отправляете.

OpenIddict не предназначен для использования без резервной БД (для хранения приложений, авторизаций или токенов).

Если вы предпочитаете (почти) работу без состояния, вы можете попробовать ASOS - низкоуровневый обработчик OIDC-сервера, стоящий за OpenIddict: https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server. Он будет поддерживать ваш сценарий, не заставляя вас создавать DB.

...