Минимальный API dotNET, получающий ошибку 404, не найден в защищенной конечной точкеC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Минимальный API dotNET, получающий ошибку 404, не найден в защищенной конечной точке

Сообщение Anonymous »

Я пытаюсь реализовать API для отдыха, используя платформу dotNET. У меня возникла проблема с конечной точкой «/secure», и я получаю 404 в качестве ответного сообщения независимо от того, вхожу я в систему или нет.
Если я не использую класс IdentityUser и если я использую / конечная точка входа в систему, которая закомментирована в коде, конечная точка "/secure" работает правильно, получая 401, если вы не вошли в систему, и 200 после входа в систему.
Кроме того, не могли бы вы объяснить мне, если я нужно использовать builder.Services.AddControllers()?
Спасибо всем!
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using ApiLogin;
using ApiLogin.Api;
using ApiLogin.Database;
using ApiLogin.Handlers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext(opt => opt.UseInMemoryDatabase("TodoList"));

// // Register Identity services
builder.Services.AddIdentity()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();

// Id, Version, Path
var api = new Api("api-v0", "v0", "/v0");

// Swagger
// builder.Services.AddControllers();

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen((options) => {
options.SwaggerDoc(api.Id, new() { Title = api.Id, Version = api.Version });
});

// Authentication
var key = Encoding.ASCII.GetBytes("YourSuperSecretKeyThatIsAtLeast32BytesLong!");
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.TokenValidationParameters = new TokenValidationParameters {
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key)
};
});

builder.Services.AddAuthorization();

var app = builder.Build();

app.UsePathBase("/api");

// Authentication
app.UseAuthentication();
app.UseAuthorization();

// Endpoint
var endpoint = app.MapGroup(api.Path).WithGroupName(api.Id);
// ApiV0.MapEndpoints(endpoint);

var todoItems = endpoint.MapGroup("todoitems").WithTags("ToDoItems");
_ = todoItems.MapGet("/", ListTodos.Handle);

// Authentication
// Endpoint definition
// endpoint.MapPost("/login", (LoginModel model) => {

// if (model.Username == "testuser" && model.Password == "Password123!") {
// var tokenHandler = new JwtSecurityTokenHandler();
// var tokenDescriptor = new SecurityTokenDescriptor {
// Subject = new ClaimsIdentity(new Claim[] { new Claim(ClaimTypes.Name, model.Username) }),
// Expires = DateTime.UtcNow.AddDays(7),
// SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
// };
// var token = tokenHandler.CreateToken(tokenDescriptor);
// var tokenString = tokenHandler.WriteToken(token);
// return TypedResults.Ok(new { Token = tokenString });
// }
// return Results.Unauthorized();
// });

endpoint.MapPost("/register", async (RegisterModel model, UserManager userManager) => {
var user = new IdentityUser { UserName = model.Username, Email = model.Email };
var result = await userManager.CreateAsync(user, model.Password);
if (result.Succeeded) {
return TypedResults.Ok();
}
return Results.BadRequest(result.Errors);
});

endpoint.MapPost("/login", async (LoginModel model, UserManager userManager, SignInManager signInManager) => {
var user = await userManager.FindByNameAsync(model.Username);
if (user != null && await userManager.CheckPasswordAsync(user, model.Password)) {
var tokenHandler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor {
Subject = new ClaimsIdentity(new Claim[] {
new Claim(ClaimTypes.Name, user.UserName!)
}),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
return TypedResults.Ok(new { Token = tokenString });
}
return Results.Unauthorized();
});

endpoint.MapGet("/secure", [Authorize] () => "This is a secure endpoint");

// Swagger UI
if (app.Environment.IsDevelopment()) {
_ = app.UseSwagger();
_ = app.UseSwaggerUI(options => {
options.SwaggerEndpoint($"{api.Id}/swagger.yaml", api.Id);
});
}

await app.RunAsync();


Контекст приложения
using ApiLogin.Database.Entities;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace ApiLogin.Database;

public class ApplicationContext : IdentityDbContext {

public DbSet Todos => Set();

public ApplicationContext() { }

public ApplicationContext(DbContextOptions options)
: base(options) {
}

}



Подробнее здесь: https://stackoverflow.com/questions/787 ... e-endpoint
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»