缺少 ASP.NET Core Identity 端点

问题描述 投票:0回答:1

我是 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 中:

enter image description here

我在我的

[Authorize]
API 端点上添加了
/products
注释,并尝试进行调用,它告诉我我没有获得授权,而之前我只是获取产品列表,所以我知道身份正在部分工作。

任何人都可以指出我做错了什么吗?

c# swagger asp.net-core-webapi asp.net-core-identity
1个回答
0
投票

您的

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();

Swagger

© www.soinside.com 2019 - 2024. All rights reserved.