使用C#ASP.NET MVC标识以编程方式创建用户
我试图以编程方式将用户添加到ASP.NET MVC标识中 我遇到的错误是:使用C#ASP.NET MVC标识以编程方式创建用户,c#,asp.net,asp.net-mvc,asp.net-web-api,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,Asp.net Mvc 5,我试图以编程方式将用户添加到ASP.NET MVC标识中 我遇到的错误是:UserManager引发了类型为“System.NullReferenceException”的异常。 此函数是通过非来自此站点的帖子调用的。它位于AccountController中公共异步任务寄存器(RegisterViewModel模型)的正下方 [AllowAnonymous] public async Task<bool> GenerateUser(string email) { v
UserManager引发了类型为“System.NullReferenceException”的异常。
此函数是通过非来自此站点的帖子调用的。它位于AccountController中公共异步任务寄存器(RegisterViewModel模型)的正下方
[AllowAnonymous]
public async Task<bool> GenerateUser(string email)
{
var user = new ApplicationUser { UserName = email, Email = email };
string password = System.Web.Security.Membership.GeneratePassword(12, 4);
var result = await UserManager.CreateAsync(user, password);
if (result.Succeeded)
{
// Omitted
}
else { AddErrors(result); }
return true;
}
编辑2: 如所需:这是
ApplicationUserManager
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(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 = 8,
RequireNonLetterOrDigit = false,
RequireDigit = false,
RequireLowercase = false,
RequireUppercase = false,
};
// 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;
}
}
公共静态应用程序服务器管理器创建(IdentityFactoryOptions选项,IOwinContext上下文)
{
var manager=newapplicationUserManager(newuserstore(context.Get());
//为用户名配置验证逻辑
manager.UserValidator=新的UserValidator(管理器)
{
AllowOnlyAlphanumericUserNames=false,
RequireUniqueEmail=true
};
//配置密码的验证逻辑
manager.PasswordValidator=新密码验证器
{
所需长度=8,
RequiredOnletterDigit=false,
RequireDigit=false,
RequireLowercase=false,
RequireUppercase=false,
};
//配置用户锁定默认值
manager.UserLockoutEnabledByDefault=true;
manager.DefaultAccountLockoutTimeSpan=TimeSpan.FromMinutes(5);
manager.MaxFailedAccessAttemptsBeforeLockout=5;
//注册双因素身份验证提供商。此应用程序使用电话和电子邮件作为接收验证用户代码的步骤
//您可以编写自己的提供者并将其插入此处。
manager.RegisterWofactorProvider(“电话代码”,新电话号码提供程序)
{
MessageFormat=“您的安全代码为{0}”
});
manager.RegisterWofactorProvider(“电子邮件代码”,新的EmailTokenProvider
{
Subject=“安全代码”,
BodyFormat=“您的安全代码为{0}”
});
manager.EmailService=新的EmailService();
manager.SmsService=新的SmsService();
var dataProtectionProvider=options.dataProtectionProvider;
if(dataProtectionProvider!=null)
{
manager.UserTokenProvider=
新的DataProtectorTokenProvider(dataProtectionProvider.Create(“ASP.NET标识”);
}
退货经理;
}
}
问题在于UserManager,这解决了问题
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 = model.Email;
user.UserName = model.Email;
string userPWD = password;
var result = UserManager.Create(user, userPWD);
ApplicationDbContext context=new ApplicationDbContext();
var角色管理器=新角色管理器(新角色存储(上下文));
var UserManager=newusermanager(newuserstore(context));
UserManager.UserValidator=新的UserValidator(UserManager)
{
AllowOnlyAlphanumericUserNames=false,
RequireUniqueEmail=true
};
字符串密码=System.Web.Security.Membership.GeneratePassword(12,4);
var user=new ApplicationUser();
user.Email=model.Email;
user.UserName=model.Email;
字符串userPWD=密码;
var result=UserManager.Create(user,userPWD);
错误在哪里?@Cid它来自第一个代码块第6行的“result”变量。由于您使用的是ApplicationUserManager
构造函数,您以前是否尝试设置UserValidator
?我想你应该在这个上下文中设置AllowOnlyAlphanumericUserNames=false
,你能在你的问题中显示ApplicationUserManager
类定义吗?@tetsuyayayamamoto这给了我一个新的错误,但我们似乎取得了进展。我现在得到的实体类型ApplicationUser不是当前上下文模型的一部分。
。我将其设置为manager.UserValidator=newuservalidator(manager){AllowOnlyAlphanumericUserNames=false,RequireUniqueEmail=true}
我还创建了密码验证程序
var result = new AccountController().GenerateUser(model.emailAddress);
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(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 = 8,
RequireNonLetterOrDigit = false,
RequireDigit = false,
RequireLowercase = false,
RequireUppercase = false,
};
// 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;
}
}
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 = model.Email;
user.UserName = model.Email;
string userPWD = password;
var result = UserManager.Create(user, userPWD);