LANCommander/LANCommander.Server.Services/Factories/IdentityContextFactory.cs
Pat Hartl 790311ac8d Various fixes for MySQL/MariaDB
- Regenerate migrations
- Fix identity database context lifetimes
- Fix rendering of edit components
- Move database settings to separate section
2026-06-12 23:48:11 -05:00

93 lines
3.5 KiB
C#

using LANCommander.Server.Data;
using LANCommander.Server.Data.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LANCommander.Server.Services.Factories
{
public class CustomUserStore : UserStore<User, Role, DatabaseContext, Guid, UserClaim, UserRole, UserLogin, UserToken, RoleClaim>
{
public CustomUserStore(DatabaseContext context) : base(context)
{
}
}
public class CustomRoleStore : RoleStore<Role, DatabaseContext, Guid, UserRole, RoleClaim>
{
public CustomRoleStore(DatabaseContext context) : base(context)
{
}
}
public class IdentityContext : IDisposable
{
public readonly DatabaseContext DatabaseContext;
public readonly UserManager<User> UserManager;
public readonly RoleManager<Role> RoleManager;
public IdentityContext(DatabaseContext databaseContext, IServiceProvider serviceProvider)
{
DatabaseContext = databaseContext;
var userStore = new CustomUserStore(DatabaseContext);
UserManager = new UserManager<User>(
userStore,
serviceProvider.GetRequiredService<IOptions<IdentityOptions>>(),
serviceProvider.GetRequiredService<IPasswordHasher<User>>(),
serviceProvider.GetRequiredService<IEnumerable<IUserValidator<User>>>(),
serviceProvider.GetRequiredService<IEnumerable<IPasswordValidator<User>>>(),
serviceProvider.GetRequiredService<ILookupNormalizer>(),
serviceProvider.GetRequiredService<IdentityErrorDescriber>(),
serviceProvider.GetRequiredService<IServiceProvider>(),
serviceProvider.GetRequiredService<ILogger<UserManager<User>>>());
var roleStore = new CustomRoleStore(DatabaseContext);
RoleManager = new RoleManager<Role>(
roleStore,
serviceProvider.GetRequiredService<IEnumerable<IRoleValidator<Role>>>(),
serviceProvider.GetRequiredService<ILookupNormalizer>(),
serviceProvider.GetRequiredService<IdentityErrorDescriber>(),
serviceProvider.GetRequiredService<ILogger<RoleManager<Role>>>());
}
public void Dispose()
{
UserManager.Dispose();
RoleManager.Dispose();
DatabaseContext.Dispose();
}
}
public class IdentityContextFactory
{
private readonly IDbContextFactory<DatabaseContext> _dbContextFactory;
private readonly IServiceProvider ServiceProvider;
public IdentityContextFactory(IDbContextFactory<DatabaseContext> dbContextFactory, IServiceProvider serviceProvider)
{
_dbContextFactory = dbContextFactory;
ServiceProvider = serviceProvider;
}
public IdentityContext Create()
{
var context = _dbContextFactory.CreateDbContext();
return new IdentityContext(context, ServiceProvider);
}
public async Task<IdentityContext> CreateAsync()
{
var context = await _dbContextFactory.CreateDbContextAsync();
return new IdentityContext(context, ServiceProvider);
}
}
}