2014-04-17 7 views
0

ASP.NET Identity를 기존의 (오히려 복잡한) 데이터베이스 모델에 매핑하는 사용자 지정 UserStore를 구현하려고합니다. 데이터베이스에는 사용자 데이터를 저장하는 데 사용하려는 기존 테이블 '연락처'가 있습니다. 이 테이블에는 int identity (1,1) 기본 키가 있습니다. 그래서 저는 IUser를 구현하는 ContactUser라는 클래스와 IUserStore를 구현하는 ContactUserStore라는 클래스를 만들었습니다. 이제 기본 로그인이 작동합니다.신원 키가있는 ASP.NET ID 사용자 지정 UserStore

그러나 새로운 사용자 등록을 할 수 없습니다. 내가하려고 할 때 :

IdentityResult result = await UserManager.CreateAsync(user, model.Password); 

그것은 userId를 찾을 수 없다는 불평과 함께 폭탄을 터뜨린다.

AspNet ID가 ContactUserStore.CreateAsync (ContactUser 사용자)를 호출 할 때 데이터베이스에 만들어진 연락처 레코드의 ID 키를 알지 못하기 때문에 발생합니다. 이 메서드는 성공적으로 완료 (연락처 레코드 만들기)하지만 방금 생성 한 사용자가 아닌 userId = 0으로 ContactUserStore.FindByIdAsync (int userId)를 호출합니다.

전달할 수있는 방법이 있습니까? CreateAsync()에서 데이터베이스에 생성 된 userID의 @@ identity 값을 다시 표시 하시겠습니까? 또는 FindByName() 또는 FindByEmail() 메서드를 사용하여 생성 후 사용자를 선택하도록 강요합니까?

답변

1

DbContext에 대해 OnModelCreating에서 키를 매핑 했습니까?

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     var user = modelBuilder.Entity<TUser>() 
      .HasKey(u => u.ContactId) 
+0

내가 EntityFramework를 사용하지 않는; 나는 Insight.Database, 마이크로 orm을 사용하여 공급자를 구현했습니다. – Maarten

2

나는이 문제를 직접 해결했습니다. Microsoft.AspNet.Identity.Core 어셈블리를 반영하여 발생한 상황과 해결 방법을 이해해야했습니다.

문제는 실제로 SignIn()이 호출 한 ClaimsIdentityFactory에서 발생하는 것으로 나타났습니다. 이 함수는 초기화되지 않은 Id를 가진 사용자 개체를받은 다음 UserStore.FindByIdAsync()를 수행합니다. 내가해야만했던 것은 ClaimsIdentityFactory를 서브 클래 싱하고, CreateAsync를 오버라이드하고, Id = 0 조건을 체크하는 것이었다. 이 경우 ID를 얻기 위해 FindByName을 수행합니다. ID를 얻으려면 @@ ID를 사용하는 것을 선호하지만 지금은이 방법이 효과적입니다.

내가 넣어 내 (철저하게 테스트되지 않음)의 경우 사람에 code on github here가 관심 (마이크로 ORM을 사용하여 사용자 지정 ID 공급자)

+0

ClaimsIdentityFactory.CreateAsync - 왜 sig 메서드를 사용합니까? public override async 작업 CreateAsync (UserManager manager, ContactUser user, string authenticationType)? ReSharper는 무효화 할 수있는 것이 없다고보고합니다. –