programing

ASP 이동 중.NET 아이덴티티 모델에서 클래스 라이브러리

mailnote 2023. 7. 30. 18:01
반응형

ASP 이동 중.NET 아이덴티티 모델에서 클래스 라이브러리

다음 링크의 메서드를 사용하여 ID 모델을 클래스 라이브러리로 이동하려고 합니다.

서비스 라이브러리의 ASP.NET ID

문제 1: 웹 사이트 프로젝트의 연결 문자열을 계속 사용하는 것 같습니다.저는 클래스 라이브러리에 전체 연결 문자열을 지정하여 극복했습니다.IdentityDbContext가 클래스 라이브러리의 연결 문자열을 사용하도록 할 수 있습니까?

문제 2: 문제 1로 인해, 제가 웹사이트 프로젝트에서 엔티티 프레임워크를 제거하면,웹사이트 프로젝트에서 EF의 SqlClient를 찾는다는 오류가 발생합니다.

'System' 유형의 예외입니다.잘못된 작업EntityFramework.dll에서 '예외'가 발생했지만 사용자 코드에서 처리되지 않았습니다.

추가 정보:ADO에 대한 엔티티 프레임워크 제공자를 찾을 수 없습니다.불변 이름이 'System'인 NET 공급자입니다.Data.SqlClient'입니다.공급자가 애플리케이션 구성 파일의 'entityFramework' 섹션에 등록되어 있는지 확인합니다.자세한 내용은 http://go.microsoft.com/fwlink/ ?LinkId=260882를 참조하십시오.

웹 사이트 프로젝트에서 EF와 같은 모든 데이터 액세스 계층 참조를 생략하면 다른 솔루션을 사용할 수 있습니다.

IdentityModel을 클래스 라이브러리(SRP에 따라 올바른 작업)로 이동하려면 다음 단계를 수행합니다.

  1. 클래스 라이브러리를 만듭니다. (클래스 라이브러리1)
  2. NuGet을 사용하여 Microsoft에 대한 참조를 추가합니다.AsNet.신원.엔티티 프레임워크입니다.이렇게 하면 일부 다른 참조도 자동으로 추가됩니다.
  3. 웹 사이트의 참조를 Class Library1에 추가합니다.
  4. WebSite/Models/IdentityModel.cs 를 찾아 ClassLibrary1로 이동합니다.
  5. IdentityModel.cs 을 다음과 같이 만듭니다.

    public class ApplicationUser : IdentityUser
    {
    }
    
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("YourContextName")
        {
        }
    }
    
  6. 웹 사이트의 Web.config에 해당 섹션의 올바른 데이터베이스를 가리키는 ContextName이 있는지 확인합니다.(참고: 이 데이터베이스는 응용프로그램 데이터를 저장할 수 있으며 저장해야 합니다.)

    <add name="YourContextName" connectionString="YourConnectionStringGoesHere"
      providerName="System.Data.SqlClient" />
    
  7. ApplicationDbContext에서 EF Context 클래스를 상속합니다.

    public class YourContextName : ApplicationDbContext
    {
        public DbSet<ABizClass1> BizClass1 { get; set; }
        public DbSet<ABizClass2> BizClass2 { get; set; }
        // And so forth ...
    }
    

사이트의 다른 사용자가 로그인하거나 등록하려고 하면 ID 시스템은 ID 테이블을 포함한 모든 데이터와 함께 해당 사용자의 데이터베이스로 라우팅합니다.

파이팅!

EF6 및 Identity 2.0에 대한 @Rap의 답변 업데이트:

  1. 클래스 라이브러리를 만듭니다. (클래스 라이브러리1)
  2. NuGet을 사용하여 Microsoft에 대한 참조를 추가합니다.AsNet.신원.엔티티 프레임워크 및 마이크로소프트.AsNet.신원.오윈.
  3. 웹 사이트의 참조를 Class Library1에 추가합니다.
  4. WebSite/Models/IdentityModel.cs 를 찾아 ClassLibrary1로 이동합니다.
  5. IdentityModel.cs 은 다음과 같이 보여야 합니다. 아무것도 변경할 필요가 없습니다.

    public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
            // Add custom user claims here
            return userIdentity;
        }
    }
    
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }
    
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }
    
  6. 웹 사이트의 Web.config에 섹션의 올바른 데이터베이스를 가리키는 컨텍스트가 있는지 확인합니다.(참고: 이 데이터베이스는 응용프로그램 데이터를 저장할 수 있으며 저장해야 합니다.)

    <connectionStrings>
      <add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=Project;Integrated Security=sspi;Pooling=false;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    
  7. ApplicationDbContext에서 EF Context 클래스를 상속합니다.

    public class YourContextName : ApplicationDbContext
    {
        public DbSet<ABizClass1> BizClass1 { get; set; }
        public DbSet<ABizClass2> BizClass2 { get; set; }
        // And so forth ...
    }
    

제가 파티에 조금 늦었다고 생각하지만, 미래의 독자들을 위해, 여기 좋은 읽을거리가 있습니다.

아이덴티티를 클래스 라이브러리로 이동한다는 것은 무엇을 의미합니까? 참조로 사용한다는 것입니까?사용자 지정 사용자 관리자와 사용자가 별도의 라이브러리에 있지만, 그게 전부입니다.

신원 정보에는 일종의 데이터 저장소가 필요합니다.EF를 사용하도록 ID를 구성하는 경우 EF에 대한 추가 너겟 패키지를 가져와야 하며 컨텍스트를 생성할 때 연결 문자열을 전달할 수 있어야 합니다.

내 머리에서 당장에...

var mgr = new UserManager<ApplicationUser>(
     new IUserStore_ofYourChoice<ApplicationUser>(
       new DbContextName("ConnectionStringOverload"));

EF 스토어가 "UserStore"인 것 같은데, 확인해봐야 합니다.

현재 Identity용 데이터스토어에는 거의 12개의 다양한 너지트 패키지가 있습니다.당신은 EF를 사용할 필요가 없지만, 그것은 어떤 종류의 가게를 필요로 합니다.

편집 **

또한 참조로 항상 기본 프로젝트의 구성과 정의된 연결 문자열을 사용합니다. 기본적으로 그렇게 하면 작동합니다.

당신이 인식하고 기억해야 할 몇 가지 규칙이 있습니다.

첫째, 웹 프로젝트는 항상 그리고 자신의 프로젝트 기간에 찾은 web.config 파일만 사용합니다.솔루션의 다른 위치에 있는 다른 구성 파일에 무엇을 넣는지는 중요하지 않습니다.웹 프로젝트는 자체 프로젝트에서 찾은 내용만 사용할 수 있습니다.다른 프로젝트에 연결 문자열이 있는 경우 이를 웹 프로젝트로 복제해야 합니다. 그렇지 않으면 연결 문자열을 찾을 수 없습니다.

둘째, 웹 프로젝트가 시작 프로젝트라고 가정하고 ID에서 사용하기 때문에 데이터 마이그레이션을 사용하고 있다고 가정합니다. 패키지 관리자는 항상 시작 프로젝트에서 찾은 연결 문자열을 사용합니다.따라서 업데이트 데이터베이스에 대한 패키지 관리자는 모델 프로젝트에서 연결 문자열을 사용하지 않습니다.

간단한 해결책은 다음과 같습니다.모델 프로젝트에서 웹 프로젝트로 연결 문자열을 복사합니다. 2.패키지 관리자 콘솔에서 컨텍스트를 선택하는 드롭다운이 모델 프로젝트를 가리키는지 확인합니다.

질문 1:-

아래 링크에 있는 솔루션을 사용할 수 있을 것 같습니다.

동적 연결 문자열에 대한 엔티티 프레임워크 설정

질문 2:-

엔티티 프레임워크는 실행 시간이 해당 프로젝트의 web.config를 사용하는 방식으로 구축된다고 생각합니다.마이크로소프트의 지침은 또한 다음을 제안합니다.

http://msdn.microsoft.com/en-us/library/vstudio/cc716677(v=vs.100).aspx

언급URL : https://stackoverflow.com/questions/23446919/moving-asp-net-identity-model-to-class-library

반응형