Невозможно запросить токен, поля запроса пусты

#asp.net-core #jwt #openiddict

#asp.net-ядро #jwt #openiddict

Вопрос:

Я пытаюсь создать API для SPA. Я использую последнюю версию .NET Core, MVC и EF. Я хотел бы аутентифицировать пользователей с помощью JWT, поэтому я решил использовать ядро openiddict. Я попытался настроить его в соответствии с примерами на странице github и этом сообщении в блоге. Проблема в том, что я получаю «Указанный тип предоставления не поддерживается». при запросе токена.

Вот скриншот запроса postman: Запрос Postman

Вот мой ConfigureServices метод:

 public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddApplicationInsightsTelemetry(Configuration);

    services.AddMvc();

    services.AddDbContext<ApplicationDbContext>(
        options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])
    );

    services.AddIdentity<ApplicationUser, ApplicationRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddOpenIddict<ApplicationDbContext>()
        .UseJsonWebTokens()
        .EnableTokenEndpoint("/connect/token")
        .AllowPasswordFlow()
        .DisableHttpsRequirement()  // TODO: remove in production
        .AddEphemeralSigningKey();  // TODO: replace with a certificate, this should be used for development only
}
  

И Configure метод:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseApplicationInsightsRequestTelemetry();

    app.UseApplicationInsightsExceptionTelemetry();

    // don't use identity as this is a wrapper for using cookies, not needed
    // app.UseIdentity();

    app.UseJwtBearerAuthentication(new JwtBearerOptions
    {
        AutomaticAuthenticate = true,
        AutomaticChallenge = true,
        RequireHttpsMetadata = false,  // TODO: remove, dev only
        Audience = "http://localhost:42443/",  // TODO: ???
        Authority = "http://localhost:42443/"  // TODO: ???
    });

    app.UseOpenIddict();

    app.UseMvcWithDefaultRoute();
}
  

Я использую AuthorizationController из примеров для обработки запросов токенов. Наблюдая за содержимым request аргумента Exchange метода, который обрабатывает /connect/token запросы, я обнаружил, что он получает все поля в виде нулей:
Отладчик

Я понятия не имею, почему. Запрос postman должен быть корректным в соответствии с этим и этим сообщением в блоге. В чем проблема?

Ответ №1:

Как упоминалось в примерах, вы должны зарегистрировать связующее средство модели OpenIddict MVC, чтобы иметь возможность использовать OpenIdConnectRequest в качестве параметра действия.

Обратитесь к OpenIddict.Mvc пакету и вызовите AddMvcBinders , и это должно сработать:

 services.AddOpenIddict<ApplicationDbContext>()
    // Register the ASP.NET Core MVC binder used by OpenIddict.
    // Note: if you don't call this method, you won't be able to
    // bind OpenIdConnectRequest or OpenIdConnectResponse parameters.
    .AddMvcBinders()

...
  

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

1. Ах, полностью пропустил эту часть… Я даже не знал, что требуется еще один пакет 🙂 Это было оно! Спасибо! 🙂

2. @HonzaKalfus обратите внимание, что этот пакет необходим только в том случае, если вы хотите иметь возможность привязывать OpenIdConnectRequest параметры. Вы все еще можете использовать HttpContext.GetOpenIdConnectRequest() , если предпочитаете низкоуровневый API.