При настройке аутентификации и авторизации с помощью конечных точек web.api и использовании:
\packages\microsoft.aspnetcore.identity.entityframeworkcore\8.0.6 \packages\microsoft.entityframeworkcore.sqlserver\8.0.6 \packages\microsoft.aspnetcore.spaproxy\8.0.6\
Я получаю следующую ошибку при попытке вызвать любой из созданных методов API: (например, /login или /register)
Microsoft.AspNetCore.Http.BadHttpRequestException: Failed to read parameter "LoginRequest login" from the request body as JSON. ---> System.Text.Json.JsonException: The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. Path: $ | LineNumber: 0 | BytePositionInLine: 0. ---> System.Text.Json.JsonReaderException: The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. LineNumber: 0 | BytePositionInLine: 0.`
моя конфигурация следующая:
var myAllowSpecificOrigins = "_myAllowSpecificOrigins";
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(options =>
{
options.AddPolicy(name: myAllowSpecificOrigins,
policy => {
policy.AllowAnyMethod()
.AllowAnyHeader()
.SetIsOriginAllowed(origin => true)
.AllowCredentials();
});
});
// Add services to the container.
builder.Services.AddSingleton<IDictionary<string, UserConnection>>(opts => new Dictionary<string, UserConnection>());
builder.Services.AddSingleton<IDictionary<string, ChatRoom>>(opts => new Dictionary<string, ChatRoom>());
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddSignalR();
builder.Services.AddDbContext(
options => options.UseSqlServer("Server=DESKTOP-EI90NJF\SQLEXPRESS;User Id=WebChatUser;Password=Password123;Database=WebChat")
);
builder.Services.AddIdentityCore()
.AddEntityFrameworkStores()
.AddApiEndpoints();
builder.Services.AddAuthentication().AddBearerToken(IdentityConstants.BearerScheme);
builder.Services.AddAuthorizationBuilder();
var app = builder.Build();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseCors(myAllowSpecificOrigins);
app.UseMiddleware();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapHub("/chatHub");
app.MapFallbackToFile("/index.html");
app.MapIdentityApi();
app.MapControllers();
app.Run();
ОТРЕДАКТИРОВАНО: тест был выполнен с использованием пользовательского интерфейса Swagger, созданного приложением и настроенного с помощью (builder.Services.AddSwaggerGen(); app.UseSwagger(); app.UseSwaggerUI()).
Я воспроизвел вашу проблему с возвратом 400 badrequest, и мои данные пусты, но не равны нулю с пробелом или вводом. Каковы ваши данные и код состояния, какой HTML-код вы получили? Судя по сообщению об ошибке, проблема в том, что запрос на вход в систему не распознается. Было бы лучше, если бы вы могли поделиться.
Я просто вызываю это из сгенерированной страницы чванства. в теле есть: { "email": "[email protected]", "password": "Password" } : код состояния 400
после анализа исключения я заметил, что какое-то промежуточное программное обеспечение (пустая реализация) было активным и (я думаю, чтобы понять почему) удаляло тело запроса).
После удаления этого промежуточного программного обеспечения все стало нормально анализироваться.
закрытие вопроса. я обновлю сообщение о том, почему пользовательское пустое промежуточное программное обеспечение может создать эту проблему позже
Обновлено: эта проблема, описывающая проблему с доступом к телу запроса в пользовательском промежуточном программном обеспечении, объясняет, что тело запроса представляет собой поток, и это может вызвать проблемы, если мы попытаемся его прочитать.
Чтение тела запроса в промежуточном программном обеспечении для .Net 5
По мере чтения тела позиция потока будет обновляться до конца потока, что не позволит больше читать. поток можно перемотать назад, но это не очень хорошая практика, поскольку тело может быть очень большим.
Это как-то связано с атрибутом [FromBody], но я до сих пор не могу понять, в чем проблема.