Использование шаблона, встроенного в VS2017 для Core 2 MVC с аутентификацией. Попытка заполнить базу данных пользователями и ролями. Роли работают хорошо, они сеют. Пользователи всегда возвращают сообщение об ошибке «Не может быть NULL», я думаю, это потому, что эта строка в конце функции инициализации не может найти пользователя.
await _userManager.AddToRoleAsync(await _userManager.FindByNameAsync(user), "Administrator");
Я использовал этот пост, чтобы создать его: https://gist.github.com/mombrea/9a49716841254ab114d2cdabd >
ПРИМЕЧАНИЕ. Этот пост предназначен для Core 1.0, и я использую Core 2.0, возможно, поэтому у меня возникают проблемы.
Как уже упоминалось, я могу засеять роли, но пользователь не создает себя. Как только я это выясню, я попробую несколько пользователей, я уже провел тест, создав несколько ролей.
Вот класс инициализатора
//Taken from :
//https://gist.github.com/mombrea/9a49716841254ab1d2dabd49144ec092
public interface IdentityDBIitializer
{
void Initialize();
}
public class LatestUserDBInitializer : IdentityDBIitializer
{
private readonly ApplicationDbContext _context;
private readonly UserManager<ApplicationUser> _userManager;
private readonly RoleManager<IdentityRole> _roleManager;
public LatestUserDBInitializer(
ApplicationDbContext context,
UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole> roleManager)
{
_context = context;
_userManager = userManager;
_roleManager = roleManager;
}
//This example just creates an Administrator role and one Admin users
public async void Initialize()
{
//create database schema if none exists
_context.Database.EnsureCreated();
//If there is already an Administrator role, abort
//if (_context.Roles.Any(r => r.Name == "Administrator")) return;
//Create the Administartor Role
//await _roleManager.CreateAsync(new IdentityRole("Administrator"));
//Create the default Admin account and apply the Administrator role
string user = "[email protected]";
string password = "z0mgchangethis";
await _userManager.CreateAsync(new ApplicationUser { UserName = user, Email = user, EmailConfirmed = true }, password);
await _userManager.AddToRoleAsync(await _userManager.FindByNameAsync(user), "Administrator");
}
}
Вот мой стартап:
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<POSContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("UKFest2018Context")));
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("UKFestIdentityContext")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// Add Database Initializer
services.AddScoped<IdentityDBIitializer, LatestUserDBInitializer>();
// Add application services.
services.AddTransient<IEmailSender, EmailSender>();
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IdentityDBIitializer dBInitializer)
{
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseAuthentication();
//Seeds Identity DB
dBInitializer.Initialize();
//UserRoleInitializer.InitializeUsersAndRoles(app.ApplicationServices);
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
ApplicationUser
не должно быть пустым, поэтомуCannot be NULL
, вероятно, нужно посмотреть, какое из них требуется. - person mvermef   schedule 02.03.2018P@ssw0rd!
, или вы можете настроить пользовательские параметры в своем запуске, чтобы получить любой тип пароля, который вы хотите. - person Sabir Hossain   schedule 02.03.2018