将ASP.NET Identity模型移动到类库

Joe*_*Yap 40 .net c# asp.net entity-framework asp.net-identity

我正在尝试使用此链接中的方法将Identity模型移动到类库:

服务库中的ASP.NET标识

问题1:似乎继续使用Website项目的连接字符串.我通过在类库中指定完整的连接字符串来克服它.我可以使IdentityDbContext使用类库的连接字符串吗?

问题2:由于问题1,如果我从网站项目中删除实体框架.它会给出以下错误:它正在网站项目中寻找EF的SqlClient.

EntityFramework.dll中出现"System.InvalidOperationException"类型的异常,但未在用户代码中处理

附加信息:没有为ADO.NET提供程序找到具有不变名称"System.Data.SqlClient"的实体框架提供程序.确保提供程序已在应用程序配置文件的"entityFramework"部分中注册.有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882.

其他解决方案是受欢迎的,只要它省略了网站项目中的所有数据访问层引用,如EF.

Rap*_*Rap 67

要将IdentityModel移动到类库(根据SRP,这是正确的事情),请按照下列步骤操作:

  1. 创建一个类库.(ClassLibrary1的)
  2. 使用NuGet,添加对Microsoft.AspNet.Identity.EntityFramework的引用.这也将自动添加一些其他引用.
  3. 在您的网站中添加一个引用到ClassLibrary1
  4. 找到WebSite/Models/IdentityModel.cs并将其移动到ClassLibrary1.
  5. 使IdentityModel.cs看起来像这样:

    public class ApplicationUser : IdentityUser
    {
    }
    
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("YourContextName")
        {
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  6. 确保您网站的Web.config具有指向该部分中正确数据库的YourContextName.(注意:此数据库可以并且应该包含您的应用程序数据).

    <add name="YourContextName" connectionString="YourConnectionStringGoesHere"
      providerName="System.Data.SqlClient" />
    
    Run Code Online (Sandbox Code Playgroud)
  7. 使您的EF Context类继承自ApplicationDbContext:

    public class YourContextName : ApplicationDbContext
    {
        public DbSet<ABizClass1> BizClass1 { get; set; }
        public DbSet<ABizClass2> BizClass2 { get; set; }
        // And so forth ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

当您站点中的任何人尝试登录或注册时,Identity系统会使用包含Identity表的所有数据将它们路由到您的数据库.

很高兴去!

  • 我还建议将ApplicationDbContext分解到IdentityModels文件之外的数据项目中的自己的文件中 (6认同)
  • 我非常喜欢这个解决方案.我需要这样做,所以,我在github上发布了我的这个解决方案的版本:https://github.com/jjroman/ASPNetIdentityToLib.我希望它可以帮助另一个开发人员. (4认同)

Ogg*_*las 7

@ Rap对EF6和Identity 2.0的回答更新:

  1. 创建一个类库.(ClassLibrary1的)
  2. 使用NuGet,添加对Microsoft.AspNet.Identity.EntityFramework和Microsoft.AspNet.Identity.Owin的引用.
  3. 在您的网站中添加一个引用到ClassLibrary1
  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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  6. 确保您网站的Web.config在该部分中有一个指向正确数据库的上下文.(注意:此数据库可以并且应该包含您的应用程序数据).

    <connectionStrings>
      <add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=Project;Integrated Security=sspi;Pooling=false;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    
    Run Code Online (Sandbox Code Playgroud)
  7. 使您的EF Context类继承自ApplicationDbContext:

    public class YourContextName : ApplicationDbContext
    {
        public DbSet<ABizClass1> BizClass1 { get; set; }
        public DbSet<ABizClass2> BizClass2 { get; set; }
        // And so forth ...
    }
    
    Run Code Online (Sandbox Code Playgroud)


Wil*_*iam 1

将 Identity 移入类库是什么意思?可以作为参考吗?我的自定义用户管理器和用户位于单独的库中,但仅此而已。

身份信息需要某种类型的数据存储。如果将 Identity 配置为使用 EF,请务必为其获取附加的 nuget 包,并且在创建上下文时应该能够传递连接字符串。

从我的头顶掉下来...

var mgr = new UserManager<ApplicationUser>(
     new IUserStore_ofYourChoice<ApplicationUser>(
       new DbContextName("ConnectionStringOverload"));
Run Code Online (Sandbox Code Playgroud)

我认为 EF 存储是“UserStore”,需要验证。

现在有近十几个不同的用于 Identity 数据存储的 nuget 包。您不必使用 EF,但它需要某种存储。

** 编辑 **

另外,作为参考,默认情况下它总是使用主项目的配置,因此它定义的连接字符串,这就是它的工作方式,所以没关系。