I'm brand new to ASP.NET Core Identity and I'm trying to get a working example project going.
I had a previous project that used .net Entity Core and the project was working with a controller and a postgres database for basic CRUD operations.
I wanted to add Identity Core though so I started following the tutorial on Learn Microsoft.
Apparently Identity Core is supposed to generate some endpoints automatically for me but when I view my Swagger API page only my endpoints I created on my Controller are showing up.
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();
The tutorial had me create this DbContext
class for Identity:
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)
{ }
}
In my Program.cs
file (as shown above), I'm adding:
builder.Services
.AddIdentityApiEndpoints<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
and
app.MapIdentityApi<IdentityUser>();
Which I thought would create my endpoints for me but they don't show up in Swagger for me:
I put an [Authorize]
annotation on my /products
API endpoint and try to make the call and it tells me I'm not authorized when before I would just get a list of products back so I know Identity is partially working.
Can anyone point out what I am doing wrong?
You are missing builder.Services.AddEndpointsApiExplorer();
in your program.cs
. aspnet core has two flavour Controllers
and minimal api Endpoints
. Entity framework core identity default api is exposed as minimal api endpoints. Hence, you need to add AddEndpointsApiExplorer
. Following is a working 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();