2012-12-12 2 views
2

MVC 4, Simplemembership간단한 회원 가입은 중복 된 사용자 아이디 오류 줄 WebSecurity.CreateUserAndAccount

I 사용자가 등록 할 수 있도록 상자 MVC 4 템플릿 기능의 아웃하지 않으 따라서 기업 사용을위한 웹 응용 프로그램을 구축하고 사용 . 대신 관리자 만이 액세스하여 사용자를 만들 수있는 사용자 만들기보기가 필요합니다. 레지스터 컨트롤러의 보안을 변경하고 현재 로그인 한 사용자가 기존의 Register View ...를 사용하여 사용자를 만들 수 있기를 바랬습니다. 주사위가 없습니다.

다음은 컨트롤러의 코드입니다. 나는 템플릿을 변경하지 않은 :

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은 다음과 같습니다

// 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); 
     } 

A는 현재 로그인 한 사용자이를 통해 새 사용자를 만들려고 시도하면 오류가 (@ 라인 86)을 얻을 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 provider를 사용하여 이것을 달성하는 올바른 방법은 무엇입니까?

EDIT : 익명 사용자가 등록 할 수 있도록 뒤로 이동하여 디버깅 할 때 WebSecurity.CurrentUserID가 -1이므로 여전히 동일한 오류가 발생합니다. 클래스의 UserId 필드가 [DatabaseGeneratedAttribute (DatabaseGeneratedOption.Identity)] 속성으로 장식 된 경우 중복 키는 어떻게 생성 될 수 있습니까?

+0

관리자 계정을 시드 한 다음 등록 작업에 권한을 부여하십시오. 그러면 시드 된 관리자 만 액세스 할 수 있습니다. – Komengem

+0

차드,이 문제를 해결 했습니까? 나는 똑같은 문제를 가지고 있으며 그것을 어떻게 해결할 지 정말로 모른다. – HenningJ

+0

아니요, 나머지 앱을 개발하는 동안 잠시 기다렸지 만 곧 다시 돌아갈 예정입니다. –

답변

1

마지막으로이 문제가 다시 발생했습니다. 문제는 데이터베이스 관계가 손상되었다는 것입니다. Membership 테이블 외래 키 제약 조건에 대한 UserProfile 테이블은 UserID 열이 BOTH 테이블의 기본 키로 기록되도록 설정되었습니다. 따라서 UserProfile에 행을 추가하려고하면 새로 생성 된 ID가 Membership에 없으므로 오류가 발생합니다. 단순히 관계를 삭제하고 올바르게 다시 작성하여 UserProfile.UserId가 기본 고정 된 것입니다.

2

나는 동일한 문제가 있었지만 WebSecurity 대신 공급자에서 CreateUserAndAccount 메서드를 사용하여 해결했습니다.

var membership = (SimpleMembershipProvider)Membership.Provider; 
membership.CreateUserAndAccount(
    model.UserName, 
    model.Password, 
    new Dictionary<string, object>{ 
     { "FirstName", model.FirstName}, 
     { "LastName", model.LastName}, 
     { "Email", model.Email } 
    } 
); 
0

이것은 내가해야 할 모든 것입니다. UserProfile 또는 Membership 테이블에 문제가 있다고 생각하지 않습니다.

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
            new { Email=model.Email});