[英]Identity UserManager CreateAsync does not write to database
它不会给出任何错误或警告,但不会插入数据库。 好像只有memory。
此外,UserManager 的 FindByNameAsync 无法检查已在数据库中创建的用户,可能出于同样的原因。
这是我的 Controller:
public class AccountController : Controller
{
private readonly UserManager<User> _userManager;
private readonly SignInManager<User> _signInManager;
public AccountController(UserManager<User> userManager, SignInManager<User> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
public IActionResult Login()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Login(User user)
{
if (ModelState.IsValid)
{
var result = await _userManager.CreateAsync(user, user.Password);
if (result.Succeeded)
{
Console.WriteLine("OK");
}
var username = await _userManager.FindByNameAsync(user.UserName);
if (username != null)
{
//sign in
var signInResult = await _signInManager.PasswordSignInAsync(user.UserName, user.Password, false, false);
if (signInResult.Succeeded)
{
return RedirectToAction("Index", "ProjectCampaign");
}
}
}
return View();
}
public async Task<IActionResult> Logout()
{
await _signInManager.SignOutAsync();
return RedirectToAction("Login", "Account");
}
}
启动.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<RandomContext>(config =>
{
config.UseInMemoryDatabase("Memory");
});
services.AddIdentity<User, Role>(config => {
config.Password.RequireDigit = false;
config.Password.RequiredLength = 4;
config.Password.RequireNonAlphanumeric = false;
config.Password.RequireUppercase = false;
})
.AddEntityFrameworkStores<RandomContext>()
.AddDefaultTokenProviders();
services.ConfigureApplicationCookie(config =>
{
config.Cookie.Name = "AuthCookie";
config.LoginPath = "/Account/Login";
config.ExpireTimeSpan = TimeSpan.FromMinutes(1);
});
services.AddScoped<RandomContext>();
services.AddControllersWithViews().AddRazorRuntimeCompilation();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
用户.cs
public partial class User : IdentityUser<int>
{
public int ID { get; set; }
[Required(ErrorMessage = "Username is required")]
public override string UserName { get; set; }
[Required(ErrorMessage = "Password is required")]
public string Password { get; set; }
}
随机上下文.cs
public partial class RandomContext : IdentityDbContext<User, Role, int>
{
public RandomContext()
{
}
public RandomContext(DbContextOptions<RandomContext> options)
: base(options)
{
}
public virtual DbSet<ProjectCampaign> ProjectCampaigns { get; set; }
public virtual DbSet<Role> Roles { get; set; }
public virtual DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
optionsBuilder.UseSqlServer("Server=.;Database=Random;Trusted_Connection=True;");
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ProjectCampaign>(entity =>
{
entity.ToTable("ProjectCampaign");
entity.Property(e => e.Id).HasColumnName("ID");
entity.Property(e => e.Campaign)
.HasMaxLength(50)
.IsUnicode(false);
entity.Property(e => e.CreateDate)
.HasColumnType("datetime")
.HasDefaultValueSql("(getdate())")
.HasAnnotation("Relational:ColumnType", "datetime");
entity.Property(e => e.Project)
.HasMaxLength(50)
.IsUnicode(false);
});
modelBuilder.Entity<Role>(entity =>
{
entity.Property(e => e.Id).HasColumnName("ID");
entity.Property(e => e.CreateDate)
.HasColumnType("datetime")
.HasDefaultValueSql("(getdate())")
.HasAnnotation("Relational:ColumnType", "datetime");
entity.Property(e => e.Description)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(false);
});
modelBuilder.Entity<User>(entity =>
{
entity.Property(e => e.Id).HasColumnName("ID");
entity.Property(e => e.Password).IsRequired();
entity.Property(e => e.UserName)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(false);
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
如果您需要更多详细信息,请告诉我。
我有类似的问题 - AspNetCore.Identity.UserManager
没有抛出任何错误,但没有在CreateAsync(user, password)
条目写入数据库。 但是,当我调试UserManager
时,我可以看到PasswordValidators
数组中只有一个条目。
基本上,输入的密码不够复杂。 更改了密码,一切正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.