programing

EF 데이터베이스를 사용한 ASP.NET ID 첫 번째 MVC5

closeapi 2023. 7. 10. 22:24
반응형

EF 데이터베이스를 사용한 ASP.NET ID 첫 번째 MVC5

Database First 및 EDMX와 함께 새로운 Asp.net Identity를 사용할 수 있습니까?아니면 코드만 먼저?

제가 한 일은 다음과 같습니다.

저는 새로운 MVC5 프로젝트를 만들었고 새로운 Identity는 제 데이터베이스에 새로운 User and Roles 테이블을 만들도록 했습니다.

그런 다음 Database First EDMX 파일을 열고 관련된 다른 테이블이 있으므로 새 Identity Users 테이블을 끌어왔습니다.

EDMX를 저장하면 Database First POCO 생성기가 사용자 클래스를 자동으로 만듭니다.그러나 UserManager 및 RoleManager는 새 ID 네임스페이스(Microsoft)에서 상속되는 사용자 클래스를 필요로 합니다.애스넷. 아이덴티티.IUser), 따라서 POCO 사용자 클래스를 사용할 수 없습니다.

가능한 해결책은 사용자 클래스가 IUser에서 상속되도록 POCO 생성 클래스를 편집하는 것이라고 생각합니다.

아니면 ASP.NET Identity는 Code First Design과만 호환됩니까?

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

업데이트: 아래 앤더스 아벨의 제안에 따라, 저는 이렇게 했습니다.효과는 있지만, 좀 더 우아한 해결책이 있는지 궁금합니다.

자동으로 생성된 엔티티와 동일한 네임스페이스 내에 부분 클래스를 만들어 엔티티 User 클래스를 확장했습니다.

namespace MVC5.DBFirst.Entity
{
    public partial class AspNetUser : IdentityUser
    {
    }
}

ID에서 상속하도록 DataContext를 변경했습니다.DB 컨텍스트 대신 DB 컨텍스트입니다.EDMX를 업데이트하고 DB Context 및 Entity 클래스를 재생성할 때마다 이 값을 다시 설정해야 합니다.

 public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser>  //DbContext

자동 생성된 사용자 엔티티 클래스 내에서 다음 4개 필드에 override 키워드를 추가하거나 IdentityUser에서 상속되므로 이러한 필드에 주석을 달아야 합니다(1단계).EDMX를 업데이트하고 DB Context 및 Entity 클래스를 재생성할 때마다 이 값을 다시 설정해야 합니다.

    override public string Id { get; set; }
    override public string UserName { get; set; }
    override public string PasswordHash { get; set; }
    override public string SecurityStamp { get; set; }

POCO 및 Database First와 함께 ID 시스템을 사용할 수 있어야 하지만 몇 가지 수정 작업을 수행해야 합니다.

  1. 클래스를 POCO .tt로 만듭니다.partial그러면 별도의 파일로 추가 구현을 제공할 수 있습니다.
  2. 의부인구의 합니다.User

 

partial User : IUser
{
}

그것은 그것을 만들 것입니다.User클래스는 실제 생성된 파일을 건드리지 않고 올바른 인터페이스를 구현합니다. 생성된 파일을 삭제하는 것은 항상 좋지 않습니다.

저의 걸음걸이는 매우 비슷하지만 저는 공유하고 싶었습니다.

새 MVC5 프로젝트 생성

새 Model.edmx를 만듭니다.새 데이터베이스이고 테이블이 없는 경우에도 마찬가지입니다.

web.config를 편집하고 생성된 연결 문자열을 바꿉니다.

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-SSFInventory-20140521115734.mdf;Initial Catalog=aspnet-SSFInventory-20140521115734;Integrated Security=True" providerName="System.Data.SqlClient" />

다음 연결 문자열을 사용합니다.

<add name="DefaultConnection" connectionString="Data Source=.\SQLExpress;database=SSFInventory;integrated security=true;" providerName="System.Data.SqlClient" />

그런 다음 응용 프로그램을 빌드하고 실행합니다.사용자를 등록하면 테이블이 만들어집니다.

편집: MVC5 CodePlex 프로젝트 템플릿용 EF 데이터베이스 First를 사용한 ASP.NET ID입니다.


기존 데이터베이스를 사용하고 ApplicationUser와 관계를 만들고 싶었습니다.SQL Server를 사용하여 이 작업을 수행했지만 동일한 아이디어가 모든 DB에서 사용될 수 있습니다.

  1. MVC 프로젝트 생성
  2. Web.config의 기본 연결 아래에 나열된 DB를 엽니다.(aspnet-[timestamp] 또는 그와 유사한 이름이 될 것입니다.)
  3. 데이터베이스 테이블을 스크립팅합니다.
  4. 스크립트로 작성된 테이블을 SQL Server Management Studio의 기존 데이터베이스에 삽입합니다.
  5. 필요한 경우 ApplicationUser에 관계를 사용자 지정하고 추가합니다.
  6. 새 웹 프로젝트 만들기 > MVC > DB First Project > EF로 DB 가져오기...삽입한 ID 클래스를 제외합니다.
  7. IdentityModels.cs 에서 ApplicationDbContext를 변경합니다.:base("DefaltConnection")프로젝트의 DbContext를 사용합니다.

편집: As.Net ID 클래스 다이어그램 enter image description here

IdentityUser여기서는 가치가 없습니다. 왜냐하면 그것은 코드 첫 번째 객체이기 때문입니다.UserStore인증용입니다.내 것을 정의한 후에User는 구현, 부는하는클분구다래니현습했를스객을 하는 부분 했습니다.IUser그것은 에 의해 사용됩니다.UserManager 나는 내 업수를 . 나는 나의 수업을 원했습니다.Id 주에int를 반환합니다.ID 는 String()입니다.비슷하게 나도 원했소.nUsername무자본의

public partial class User : IUser
{

    public string Id
    {
        get { return this.UserID.ToString(); }
    }

    public string UserName
    {
        get
        {
            return this.Username;
        }
        set
        {
            this.Username = value;
        }
    }
}

당신은 절대 필요 없습니다.IUser이 인터페이스는 사용자가 사용하는 인터페이스일 뿐입니다.UserManager"IUser하려면 이 클래스를 .IUser" 구현을 사용하려면 이 클래스를 다시 작성해야 합니다.

public class UserManager<TUser> : IDisposable where TUser: IUser

당신은 이제 당신 자신의 것을 쓰시오.UserStore사용자, 클레임, 역할 등의 모든 스토리지를 처리합니다.코드 우선 인터페이스를 모두 구현합니다.UserStore 및 실행및변where TUser : IdentityUserwhere TUser : User "사용자"입니다.

public class MyUserStore<TUser> : IUserLoginStore<TUser>, IUserClaimStore<TUser>, IUserRoleStore<TUser>, IUserPasswordStore<TUser>, IUserSecurityStampStore<TUser>, IUserStore<TUser>, IDisposable where TUser : User
{
    private readonly MyAppEntities _context;
    public MyUserStore(MyAppEntities dbContext)
    { 
        _context = dbContext; 
    }

    //Interface definitions
}

다음은 일부 인터페이스 구현에 대한 몇 가지 예입니다.

async Task IUserStore<TUser>.CreateAsync(TUser user)
{
    user.CreatedDate = DateTime.Now;
    _context.Users.Add(user);
    await _context.SaveChangesAsync();
}

async Task IUserStore<TUser>.DeleteAsync(TUser user)
{
    _context.Users.Remove(user);
    await _context.SaveChangesAsync();
}

MVC 5 템플릿을 사용하여 변경했습니다.AccountController이런 식으로.

public AccountController()
        : this(new UserManager<User>(new MyUserStore<User>(new MyAppEntities())))
{
}

이제 로그인은 사용자 자신의 테이블에서 작동합니다.

GitHub에서 이 프로젝트를 살펴보십시오. https://github.com/KriaSoft/AspNet.Identity

여기에는 다음이 포함됩니다.

  • ASP.NET Identity 2.0용 SQL 데이터베이스 프로젝트 템플릿
  • 엔티티 프레임워크 데이터베이스-최초 공급자
  • 소스 코드 및 샘플

enter image description here

참고:ADO.NET Identity용 데이터베이스 우선 공급자를 만드는 방법

좋은 질문입니다.

저는 데이터베이스 제일주의자에 가깝습니다.코드 첫 번째 패러다임은 제가 보기에 느슨하고 "이동"은 너무 오류가 발생하기 쉬운 것처럼 보입니다.

저는 마이그레이션에 방해받지 않고 aspnet ID 스키마를 사용자 지정하고 싶었습니다.Visual Studio 데이터베이스 프로젝트(sql package, data-dude)와 스키마 업그레이드 작업에 대해 잘 알고 있습니다.

단순화된 솔루션은 다음과 같습니다.

aspnet ID 스키마를 미러링하는 데이터베이스 프로젝트 생성 2) 이 프로젝트의 출력(.dacpac)을 프로젝트 리소스로 사용 3) 필요할 때 .dacpac 배포

MVC5의 경우, 수정ApplicationDbContext수업이 이 일을 진행시키는 것 같습니다...

구현IDatabaseInitializer

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDatabaseInitializer<ApplicationDbContext> { ... }

생성자에서 이 클래스가 데이터베이스 초기화를 구현한다는 신호를 보냅니다.

Database.SetInitializer<ApplicationDbContext>(this);

구현InitializeDatabase:

여기서 저는 DacFX를 사용하고 .dacpac을 배포하기로 결정했습니다.

    void IDatabaseInitializer<ApplicationDbContext>.InitializeDatabase(ApplicationDbContext context)
    {
        using (var ms = new MemoryStream(Resources.Binaries.MainSchema))
        {
            using (var package = DacPackage.Load(ms, DacSchemaModelStorageType.Memory))
            {
                DacServices services = new DacServices(Database.Connection.ConnectionString);
                var options = new DacDeployOptions
                {
                    VerifyDeployment = true,
                    BackupDatabaseBeforeChanges = true,
                    BlockOnPossibleDataLoss = false,
                    CreateNewDatabase = false,
                    DropIndexesNotInSource = true,
                    IgnoreComments = true,

                };
                services.Deploy(package, Database.Connection.Database, true, options);
            }
        }
    }

저는 몇 시간 동안 이 문제를 해결하기 위해 노력했고 마침내 제 블로그에서 공유한 해결책을 찾았습니다.기본적으로, 당신은 악취가 나는 대답에 언급된 모든 것을 해야 하지만 한 가지 추가적인 것을 가지고 있어야 합니다. 즉, Identity Framework가 애플리케이션 엔티티에 사용되는 Entity Framework 연결 문자열 위에 특정 SQL-Client 연결 문자열이 있는지 확인해야 합니다.

요약하면, 응용 프로그램은 ID 프레임워크에 연결 문자열을 사용하고 응용 프로그램 엔터티에 연결 문자열을 사용합니다.각 연결 문자열의 유형이 다릅니다.전체 튜토리얼을 보려면 내 블로그 게시물을 읽으십시오.

저는 @JoshYates1980이 가장 간단한 답을 가지고 있다는 것을 발견했습니다.

일련의 시행착오 후에 저는 조쉬가 제안한 것을 했고 그것을 대체했습니다.connectionString생성된 DB 연결 문자열을 사용합니다.제가 원래 혼란스러웠던 것은 다음과 같은 게시물이었습니다.

ASP.NET MVC5 ID 인증을 기존 데이터베이스에 추가하는 방법

@Win의 수락된 답변이 변경하기 위해 언급된 경우ApplicationDbContext()연결 이름입니다.및 방식을 문자열이 되어 Entity에 됩니다.Web.configjava.

ApplicationDbContext()연결 이름이 의 기본 연결에 매핑됩니다.Web.config이 가장이지만, 파니다를 입니다. 따라서 조쉬의 방법이 가장 효과적이지만,ApplicationDbContext()더 읽기 쉽게, 나는 @Win이 원래 게시한 것처럼 당신의 데이터베이스 이름으로 이름을 변경하는 것을 제안하고 싶습니다.connectionString기본 연결"에 " 연결의 경우Web.config및 코멘트 아웃 및/또는 엔티티 생성 데이터베이스를 제거합니다.

코드 예:

모델 클래스를 유지하는 엔티티 모델 DLL 프로젝트가 있습니다.또한 모든 데이터베이스 스크립트가 포함된 데이터베이스 프로젝트를 유지합니다.제 접근법은 다음과 같습니다.

먼저 데이터베이스를 사용하여 EDMX가 있는 자신의 프로젝트 만들기

DB의 테이블을 스크립팅하고, VS2013을 사용하여 localDB(데이터 연결)에 연결하고, 스크립트를 데이터베이스 프로젝트에 복사하고, 사용자 지정 열을 추가합니다(예: BirthDate [DATE] null이 아님).

데이터베이스 배포

모델 업데이트(EDMX) 프로젝트 모델 프로젝트에 추가

응용 프로그램 클래스에 사용자 지정 열 추가

public class ApplicationUser : IdentityUser
{
    public DateTime BirthDate { get; set; }
}

MVC 프로젝트에서 AccountController는 다음을 추가했습니다.

ID 제공자가 SQL 연결 문자열을 사용하여 데이터베이스에 대해 하나의 연결 문자열만 유지하고 EF 연결 문자열에서 제공자 문자열을 추출하려고 합니다.

public AccountController()
{
   var connection = ConfigurationManager.ConnectionStrings["Entities"];
   var entityConnectionString = new EntityConnectionStringBuilder(connection.ConnectionString);
        UserManager =
            new UserManager<ApplicationUser>(
                new UserStore<ApplicationUser>(
                    new ApplicationDbContext(entityConnectionString.ProviderConnectionString)));
}

언급URL : https://stackoverflow.com/questions/19940014/asp-net-identity-with-ef-database-first-mvc5

반응형