ASP.NET Идентификатор: Дополнительные свойства для ApplicationUserRole

#c# #asp.net #entity-framework #asp.net-identity

#c# #asp.net #entity-framework #asp.net-идентификатор

Вопрос:

Я добавил дополнительное свойство в ApplicationUserRole следующим образом:

 public class ApplicationUserRole : IdentityUserRole<int>
    {
        public string RoleAssigner { get; set; }
    }
 

Теперь я должен назначить роль пользователю следующим образом:

 [HttpPost]
    public ActionResult Create(UserRoleViewModel userRoleViewModel)
    {
        if (ModelState.IsValid)
        {
            using (var context = new ApplicationDbContext())
            {
                var userRole = new ApplicationUserRole
                {
                    UserId = userRoleViewModel.UserId,
                    RoleId = userRoleViewModel.RoleId,
                    RoleAssigner = userRoleViewModel.RoleAssigner
                };
                context.ApplicationUserRoles.Add(userRole);
                context.SaveChanges();
                return RedirectToAction("Index");
            }               
        }
        return View(userRoleViewModel);
    }
 

Это работает нормально!!

Перед добавлением дополнительного свойства «RoleAssigner» я могу назначить роль пользователю, используя метод AddToRoles() следующим образом:

 [HttpPost]
    public ActionResult Create(UserRoleViewModel userRoleViewModel)
    {
        if (ModelState.IsValid)
        {      
             UserManager.AddToRoles(userRoleViewModel.Id,   userRoleViewModel.RoleName);
            return RedirectToAction("Index");
         }

        return View(userRoleViewModel);
    }
 

Мой вопрос: после добавления дополнительного свойства, такого как «RoleAssigner», есть ли какой-либо способ назначить роль пользователю с помощью метода AddToRoles (), который также вставит дополнительное значение «RoleAssigner» для столбца «RoleAssigner» в базе данных.

Ответ №1:

Редактировать с помощью рабочего примера:

Я думаю, вы можете сделать это, создав метод расширения в IdentityConfig. Я сделал что-то подобное, чтобы найти пользователя по имени пользователя или номеру телефона

Насколько я понимаю, вы хотите вызвать UserManager.Добавьте ролевые функции (…) и заполните новое свойство роли.

для этого (аналогично предыдущему примеру) вам потребуется расширение для user manager. вы делаете это так:

 public static class UserManagerExtens
{
    public static IdentityResult AddToRole(this ApplicationUserManager userManager,string userId,string[] roles,string assigner)
    {
        try
        {
            ApplicationUserRole role = null;
            using (ApplicationDbContext context = new ApplicationDbContext())
            {
                foreach (var item in roles)
                {
                    role = new ApplicationUserRole();
                    role.UserId = userId;
                    role.RoleAssigner = assigner;
                    role.RoleId = item;
                    context.AspNetUserRoles.Add(role);
                }
                context.SaveChanges();
            }
            return new IdentityResult() { };
        }
        catch (Exception ex)
        {
            return new IdentityResult(ex.Message);
        }
    }
}
 

Это рабочий пример, используя UserManager, вы можете вызвать его с определенными
параметрами, такими как:

 string[] roles = new string[] { /*your roles here*/ };
UserManager.AddToRole(/*UserIdHere*/, roles, /*assigerId here*/);
 

Аналогично этому вы можете реализовать async или другие методы UserManager.

Комментарии:

1. Пожалуйста, внимательно прочитайте весь вопрос.. То, что я на самом деле хочу, сказано в последнем пункте моего вопроса!!

2. Спасибо!! Где находится дополнительное свойство в качестве параметра в методе расширения AddToRole()?? Пожалуйста, напишите полную реализацию метода AddToRole() в соответствии с моим кодом… Надеюсь, это будет более полезно для меня!!

3. Теперь у вас есть это с конкретным примером.

4. @TanvirArjel Вы пробовали с точным примером? Если это сработало, пожалуйста, отметьте это правильно или оставьте отзыв, чтобы другие пользователи с аналогичной проблемой могли его использовать.

Ответ №2:

Если вы используете asp.net основное приложение в startup.cs вы должны внедрить правильные модели хранилища

 services.AddIdentity<ApplicationUser, YOURROLEMODEL(ApplicationUserRole )>()
 

Если вы используете asp.net приложение там должен быть файл IdentityConfig.cs, в котором вы должны реализовать свой пользовательский магазин, который даст вам RoleModel как универсальный. Вы можете видеть, что я создал класс AppUserStore, и он получает модель MyIdentityRole в качестве универсального типа. И изменил ApplicationUserManager, чтобы использовать мой класс AppUserStore.

  public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new AppUserStore(context.Get<ApplicationDbContext>()));
        // Configure validation logic for usernames
        manager.UserValidator = new UserValidator<ApplicationUser>(manager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };

        // Configure validation logic for passwords
        manager.PasswordValidator = new PasswordValidator
        {
            RequiredLength = 6,
            RequireNonLetterOrDigit = true,
            RequireDigit = true,
            RequireLowercase = true,
            RequireUppercase = true,
        };

        // Configure user lockout defaults
        manager.UserLockoutEnabledByDefault = true;
        manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
        manager.MaxFailedAccessAttemptsBeforeLockout = 5;

        // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
        // You can write your own provider and plug it in here.
        manager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider<ApplicationUser>
        {
            MessageFormat = "Your security code is {0}"
        });
        manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<ApplicationUser>
        {
            Subject = "Security Code",
            BodyFormat = "Your security code is {0}"
        });
        manager.EmailService = new EmailService();
        manager.SmsService = new SmsService();
        var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = 
                new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
        }
        return manager;
    }
}

public class AppUserStore :
    UserStore<ApplicationUser, MyIdentityRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUserStore<ApplicationUser>
{
    public AppUserStore(DbContext context) : base(context)
    {
    }
}

public class MyIdentityRole : IdentityRole
{
    public string MyProperty { get; set; }
}
 

Комментарии:

1. Не удалось понять!! Не могли бы вы объяснить мне пример, пожалуйста??

2. @TanvirArjel используете ли вы asp.net основное приложение?

3. @TanvirArjel Я изменил свой ответ, чтобы охватить и этот случай

4. @TanvirArjel Извините, я не очень хорошо понял вопрос, я показал, как заменить вашу RoleModel вместо UserRoleModel, теперь я исправлю

5. Спасибо за всю тяжелую работу!! То, что вы здесь пишете, совпадает с моим кодом файла IdentityConfig.cs. Таким образом, нет problem…My Вопрос в следующем: теперь, как я могу изменить метод AddToRoles(), который также вставит дополнительное значение свойства в базу данных вместе с идентификатором пользователя и идентификатором роли.