Я пробовал читать документы по ASP.NET Core Identity и Entity Framework. Но я все еще не чувствую себя мудрее.
Я не хочу иметь ничего общего с IdentityDbContext
, IdentityUser
, IdentityRole
. Я просто хочу использовать свою собственную реализацию DbContext
и успешно работать с UserManager
, UserStore
, RoleManager
, SignInManager
и другими классами, участвующими в входе в систему.
Итак, как было сказано, мы создали проект ASP.NET Core по умолчанию, который использует «Индивидуальные учетные записи пользователей». Теперь я хочу выяснить, какой провод DI требуется для того, чтобы этот контроллер «работал».
Смотрим на конструктор контроллера учетной записи:
public AccountController(UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
IOptions<IdentityCookieOptions> identityCookieOptions,
IEmailSender emailSender,
ISmsSender smsSender,
ILoggerFactory loggerFactory)
Наряду с этим генерируются следующие связанные классы:
public class ApplicationUser : IdentityUser
{
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
...
}
И некоторая связанная конфигурация DI:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
app.UseIdentity();
}
Копаясь в исходном коде ASP.NET Core Identity, UserStore накладывает ограничение на IdentityUser
.
public class UserStore : UserStore<IdentityUser<string>>
Я хочу работать примерно со следующим - для начала:
public class AuthenticationDbContext : DbContext
{
public AuthenticationDbContext(DbContextOptions options) : base(options)
{
}
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
public DbSet<ApplicationRole> ApplicationRoles { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<ApplicationUser>(te =>
te.HasKey(user => user.Id));
builder.Entity<ApplicationRole>(te =>
te.HasKey(role => role.Id));
}
}
public class ApplicationRole
{
public int Id { get; set; }
public string UserName { get; set; }
}
public class ApplicationUser
{
public int Id { get; set; }
public Guid Guid { get; set; }
public string GivenName { get; set; }
public string FamilyName { get; set; }
public string MiddleName { get; set; }
public DateTime? DateOfBirth { get; set; }
public string UserName { get; set; }
public string EmailAddress { get; set; }
}
Если бы я перечислил проблемы, которые у меня были, исключения и др., Этот пост был бы слишком длинным.
Вопрос в том, как мне подключить это к конфигурации DI?
IdentityUser
, поэтому я бы поставил под сомнение правильность этого способа. Учитывая, чтоUserStore
накладывает ограничение наIdentityUser
,IUserStore
нет. Я чувствую, что могу последовать примеру Лискова в этом вопросе и предоставить свою собственную реализацию любой из реализаций. Я скоро поставлю свой ответ - возможно, это не технически правильно, но это начало пути. - person Andez   schedule 30.03.2017