Ошибка заполнения пользователя с идентификаторами int в ядре Asp.net MVC6

Я использую Identity 3. Я хочу создать пользователя-администратора при запуске.

Я преобразовал строковые идентификаторы в идентификаторы «int», используя в качестве примера SwiftCourier на github. Identity 3 отличается в некоторых аспектах, и это относится к настройке «int» для идентификаторов, как показано в примере SwiftCourier, по сравнению с Identity 2 и настройка идентификаторов "int".

Я сделал это, поместив «int» после моего пользователя:

public class User : IdentityUser<int>{...}

После моей роли:

public class Role : IdentityRole<int>

и в startup.cs в службах конфигурации я ввел это:

            services.AddIdentity<User, Role>(options => options.User.AllowedUserNameCharacters = null)
            .AddEntityFrameworkStores<JobsDbContext, int>()
            .AddUserStore<UserStore<User, Role, JobsDbContext, int>>()
            .AddRoleStore<RoleStore<Role, JobsDbContext, int>>()
            .AddDefaultTokenProviders();

Затем я использовал это для заполнения ролей, и оно работает с целыми идентификаторами:

public static void EnsureRolesCreated(this IApplicationBuilder app)
    {
        var context = app.ApplicationServices.GetService<JobsDbContext>();
        if (context.AllMigrationsApplied())
        {
            var roleManager = app.ApplicationServices.GetService<RoleManager<Role>>();

            var Roles = new List<Role>();

            Roles.Add(new Role { Name = "Admin", Description = "Users able to access all areas" });
            Roles.Add(new Role { Name = "Technician", Description = "Users able to access just the schedule" });

            foreach (var role in Roles)
            {
                if (!roleManager.RoleExistsAsync(role.Name.ToUpper()).Result)
                {
                    roleManager.CreateAsync(role);
                }
            }
        }
    }

Пока все хорошо... Я хочу запустить только одного пользователя-администратора, и здесь я терплю неудачу...

Я использовал следующий Stackoverflow пример от @Guy.

Я борюсь с UserStore с этой строкой:

await new UserStore<User>(context).CreateAsync(userWithRoles.User);

Он не работает с «Пользователем», который только что переименован в мой ApplicationUser.

Ошибка, которую я получаю:

The type 'JobsLedger.Models.Identity.User' cannot be used as type parameter 'TUser' in the generic type or method 'UserStore<TUser>'. There is no implicit reference conversion from 'JobsLedger.Models.Identity.User' to 'Microsoft.AspNet.Identity.EntityFramework.IdentityUser<string>'.

Кажется, он жалуется на то, что идентификатор "int", я думаю

Как заставить UserStore работать с «int» в этом отношении? В Startup.cs установлено значение int, как показано выше.

Если мне нужно создать собственный «UserStore», который работает с «int»... как вы это делаете в Identity 3?


person si2030    schedule 24.04.2016    source источник
comment
Я привел пример добавления пользователя в роли, помогло? Если это так, пожалуйста, отметьте ответ как правильный ответ   -  person jamiedanq    schedule 24.04.2016
comment
Я только что сделал это. Я не могу создать пользователя здесь, используя идентификаторы int, не говоря уже о добавлении ролей пользователю ... его сбой в хранилище пользователей ...   -  person si2030    schedule 24.04.2016


Ответы (1)


Возможно, это не самое элегантное решение, но оно работает...

Моя цель состояла в том, чтобы посеять пользователя-администратора, а также быть добавленным к роли администратора. Мне удалось это, избегая использования UserStoreand с целочисленными идентификаторами.

using JobsLedger.DAL;
using JobsLedger.Models.Identity;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Identity;
using Microsoft.Extensions.DependencyInjection;
using System;

namespace JobsLedger.Models.Seeding
{
    public static class SeedAdminUser
    {
        public static async void EnsureAdminUserCreated(this IApplicationBuilder app)
        {
            var context = app.ApplicationServices.GetService<JobsDbContext>();
            if (context.AllMigrationsApplied())
            {
                var userManager = app.ApplicationServices.GetService<UserManager<User>>();
                var roleManager = app.ApplicationServices.GetService<RoleManager<Role>>();

                var user = new User
                {
                    UserName = "Admin",
                    NormalizedUserName = "ADMIN",
                    Email = "[email protected]",
                    NormalizedEmail = "[email protected]",
                    EmailConfirmed = true,
                    LockoutEnabled = false,
                    SecurityStamp = Guid.NewGuid().ToString()
                };

                var password = new PasswordHasher<User>();
                var hashed = password.HashPassword(user, "password");
                user.PasswordHash = hashed;

                var result = await userManager.CreateAsync(user, user.PasswordHash);

                var AdminUser = await userManager.FindByNameAsync("Admin");

                if (AdminUser != null)
                {
                    if (roleManager.RoleExistsAsync("Admin").Result)
                    {
                        var RoleResult = await userManager.AddToRoleAsync(AdminUser, "Admin");
                    }
                }
            }
        }
    }
}

Я также поместил эту запись в класс StartUp.cs после "app.UseIdentity();":

app.EnsureAdminUserCreated();

... Models.Identity имеет класс «Пользователь», и поэтому он включен в «использование».

Вам также нужно будет добавить следующее, чтобы сделать эту работу:

using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Identity;
using Microsoft.Extensions.DependencyInjection;
using System;

Наконец, вам понадобятся роли, которые уже были добавлены в соответствии с вопросом выше.

person si2030    schedule 24.04.2016