#asp.net-core #jwt #openiddict
#asp.net-ядро #jwt #openiddict
Вопрос:
Я пытаюсь создать API для SPA. Я использую последнюю версию .NET Core, MVC и EF. Я хотел бы аутентифицировать пользователей с помощью JWT, поэтому я решил использовать ядро openiddict. Я попытался настроить его в соответствии с примерами на странице github и этом сообщении в блоге. Проблема в том, что я получаю «Указанный тип предоставления не поддерживается». при запросе токена.
Вот мой 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.