使用MVC 4,Simplemembership
我正在构建一个供企业使用的Web应用程序,因此不希望开箱即用的MVC 4模板功能允许用户注册。相反,我想要一个创建用户视图,只允许管理员访问,然后创建用户。我希望我可以改变寄存器控制器的安全性,然后让当前登录的用户使用现有的Register View创建用户......没有骰子。
这是控制器中的代码。我没有从模板中更改它:
// POST: /Account/Register
[HttpPost]
//[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
WebSecurity.CreateUserAndAccount(
model.UserName,
model.Password,
new { FirstName = model.FirstName, LastName = model.LastName, Email = model.Email },
false
);
WebSecurity.Login(model.UserName, model.Password);
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
当前登录的用户尝试通过此方法创建新用户时,会出现错误(@第86行):
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_UserProfile_webpages_Membership". The conflict occurred in database "OTIS", table "dbo.webpages_Membership", column 'UserId'.
The statement has been terminated.
Line 84: try
Line 85: {
Line 86: WebSecurity.CreateUserAndAccount(
Line 87: model.UserName,
Line 88: model.Password,
Hwre是UserProfile类
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Required]
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Display(Name = "Email")]
public string Email { get; set; }
}
WebSecurity.CurrentUserID填充了当前登录的用户,我认为这是导致问题的原因。使用simplemembership提供程序实现此目的的正确方法是什么?
编辑:我已经尝试将其移回允许匿名用户注册,因此当我调试它时,WebSecurity.CurrentUserID为-1,但我仍然得到相同的错误。如果类中的UserId字段使用属性[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]进行修饰,那么如何生成重复键?
答案 0 :(得分:2)
我遇到了同样的问题,但是我使用提供程序中的CreateUserAndAccount方法而不是WebSecurity来解决它。
var membership = (SimpleMembershipProvider)Membership.Provider;
membership.CreateUserAndAccount(
model.UserName,
model.Password,
new Dictionary<string, object>{
{ "FirstName", model.FirstName},
{ "LastName", model.LastName},
{ "Email", model.Email }
}
);
答案 1 :(得分:1)
最后回到了这个问题。我的问题是我的数据库关系已损坏。设置了UserProfile表到Membership表的外键约束,以便将UserId列记录为BOTH表中的主键。因此,当它试图在UserProfile中添加一行时,它在Membership中不存在新生成的ID,从而导致错误。只需删除关系并正确重新创建,以便UserProfile.UserId是主要修复它。
答案 2 :(得分:0)
这就是我需要做的一切。我不认为UserProfile或Membership表有任何问题。
WebSecurity.CreateUserAndAccount(model.UserName, model.Password,
new { Email=model.Email});