我是 ASP.NET Core Identity 的新手,我正在尝试启动一个工作示例项目。
我之前有一个使用 .net Entity Core 的项目,该项目正在使用控制器和 postgres 数据库来进行基本的 CRUD 操作。
我想添加 Identity Core,所以我开始遵循 Learn Microsoft 上的教程。
显然 Identity Core 应该自动为我生成一些端点,但是当我查看 Swagger API 页面时,只显示我在控制器上创建的端点。
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using ShopBack.Database;
using ShopBack.Database.Repositories;
using ShopBack.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddScoped<IProductRepository, ProductRepository>()
.AddScoped<ICategoryRepository, CategoryRepository>()
.AddScoped<ProductsService>()
.AddScoped<CategoryService>()
.AddScoped<LibraryContext>()
.AddScoped<IShopUnitOfWork, ShopUnitOfWork>()
.AddScoped<IUnitOfWork, UnitOfWork>()
.AddControllers(options => options.SuppressAsyncSuffixInActionNames = false)
.AddJsonOptions(options => options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);
//https://gavilan.blog/2021/05/19/fixing-the-error-a-possible-object-cycle-was-detected-in-different-versions-of-asp-net-core/
builder.Services.AddDbContext<LibraryContext>(options =>
{
options.UseNpgsql(builder.Configuration.GetConnectionString("YourConnectionName"));
});
builder.Services.AddDbContext<ApplicationDbContext>(
options => options.UseInMemoryDatabase("AppDb"));
builder.Services.AddAuthorization();
builder.Services
.AddIdentityApiEndpoints<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// configure request pipeline
app.MapControllers();
app.UseCors (x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
);
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.MapIdentityApi<IdentityUser>();
app.Run();
教程让我为 Identity 创建了这个
DbContext
类:
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
namespace ShopBack.Database;
public class ApplicationDbContext : IdentityDbContext<IdentityUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{ }
}
在我的
Program.cs
文件(如上所示)中,我添加:
builder.Services
.AddIdentityApiEndpoints<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
和
app.MapIdentityApi<IdentityUser>();
我认为这会为我创建端点,但它们没有出现在我的 Swagger 中:
我在我的
[Authorize]
API 端点上添加了 /products
注释,并尝试进行调用,它告诉我我没有获得授权,而之前我只是获取产品列表,所以我知道身份正在部分工作。
任何人都可以指出我做错了什么吗?
您的
builder.Services.AddEndpointsApiExplorer();
中缺少 program.cs
。 aspnet core 有两种风格 Controllers
和 minimal api Endpoints
。实体框架核心身份默认 api 作为最小 api 端点公开。因此,您需要添加AddEndpointsApiExplorer
。以下是工作中的program.cs
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using System.Text.Json.Serialization;
var builder = Microsoft.AspNetCore.Builder.WebApplication.CreateBuilder(args);
builder
.Services
.AddControllers(options => options.SuppressAsyncSuffixInActionNames = false)
.AddJsonOptions(options => options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddDbContext<DataContext>(options => options.UseInMemoryDatabase("TestApp"));
builder.Services.AddAuthorization();
builder.Services
.AddIdentityApiEndpoints<IdentityUser>()
.AddEntityFrameworkStores<DataContext>();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.MapControllers();
app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
);
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapIdentityApi<IdentityUser>();
app.Run();