Я новичок в ASP.Net MVC, и я столкнулся с некоторыми трудностями при создании нового пользователя с использованием Asp.Net Identity.
Не универсальный тип UserStore не может бытьиспользуется с аргументом типа
Код, который я сделал, приведен ниже.
Метод CreateNewUser
public static bool CreateNewUser()
{
ApplicationDbContext context = new ApplicationDbContext();
//var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
string password = System.Web.Security.Membership.GeneratePassword(12, 4);
var user = new ApplicationUser();
user.Email = "test@gmail.com";
user.UserName = "test@gmail.com";
string userPWD = password;
var result = UserManager.Create(user, userPWD);
return true;
}
Вот мои классы,
Класс роли
public class Role : IdentityRole<int, UserRole>
{
public Role() { }
public Role(string name) { Name = name; }
}
Класс UserClaim
public class UserClaim : IdentityUserClaim<int>
{
}
Класс UserLogin
public class UserLogin : IdentityUserLogin<int>
{
}
Класс UserRole
public class UserRole : IdentityUserRole<int>
{
}
ApplicationUserкласс
public class ApplicationUser : IdentityUser<int, UserLogin, UserRole, UserClaim>
{
public DateTime? ActiveUntil;
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
класс RoleStore
public class RoleStore : RoleStore<Role, int, UserRole>
{
public RoleStore(ApplicationDbContext context) : base(context)
{
}
}
класс UserStore
public class UserStore : UserStore<ApplicationUser, Role, int,
UserLogin, UserRole, UserClaim>
{
public UserStore(ApplicationDbContext context) : base(context)
{
}
}
класс ApplicationSignInManager
public class ApplicationSignInManager : SignInManager<ApplicationUser, int>
{
public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager)
: base(userManager, authenticationManager)
{
}
public override Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user)
{
return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);
}
public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options, IOwinContext context)
{
return new ApplicationSignInManager(context.GetUserManager<ApplicationUserManager>(), context.Authentication);
}
}
класс ApplicationUserManager
public class ApplicationUserManager : UserManager<ApplicationUser, int>
{
public ApplicationUserManager(IUserStore<ApplicationUser, int> store)
: base(store)
{
PasswordHasher = new CustomPasswordHasher();
}
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore(context.Get<ApplicationDbContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser, int>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 8,
// 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, int>
{
MessageFormat = "Your security code is {0}"
});
manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<ApplicationUser, int>
{
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, int>(dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, Role, int,
UserLogin, UserRole, UserClaim>
{
public ApplicationDbContext()
: base("name=AppConnection")
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
public DbSet<Role> Roles { get; set; }
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
}
public class IdentityConfig
{
public void Configuration(IAppBuilder app)
{
app.CreatePerOwinContext(() => new ApplicationDbContext());
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
//app.CreatePerOwinContext<RoleManager<Role>>((options, context) =>
// new RoleManager<Role>(
// new RoleStore<Role>(context.Get<ApplicationDbContext>())));
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Home/Login"),
});
}
}
Кто-нибудь может подсказать мне, как создать нового пользователя в Asp.Net Identity?