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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将ASP.NET Identity模型移动到类库相关的知识,希望对你有一定的参考价值。

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

ASP.NET Identity in Services library

问题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。

答案

要将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") { } }
  6. 确保您网站的Web.config具有指向该部分中正确数据库的YourContextName。 (注意:此数据库可以并且应该包含您的应用程序数据)。 <add name="YourContextName" connectionString="YourConnectionStringGoesHere" providerName="System.Data.SqlClient" />
  7. 使您的EF Context类继承自ApplicationDbContext: public class YourContextName : ApplicationDbContext { public DbSet<ABizClass1> BizClass1 { get; set; } public DbSet<ABizClass2> BizClass2 { get; set; } // And so forth ... }

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

很高兴去!

另一答案

@ 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(); } }
  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. 使您的EF Context类继承自ApplicationDbContext: public class YourContextName : ApplicationDbContext { public DbSet<ABizClass1> BizClass1 { get; set; } public DbSet<ABizClass2> BizClass2 { get; set; } // And so forth ... }
另一答案

将Identity转移到类库中是什么意思?用作参考?我将自定义用户管理器和用户放在一个单独的库中,但这就是全部。

身份资料需要某种数据存储。如果将Identity配置为使用EF,请确保为其获取其他nuget包,并且您应该能够在创建上下文时传递连接字符串。

脱离我的头顶......

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

我认为EF商店是“UserStore”,需要验证。

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

**编辑**

此外,作为参考,它将始终使用配置,因此默认情况下它的主项目的定义的连接字符串,这是它的假设如何工作,所以没关系。

另一答案

你必须认识并记住一些规则。

首先,Web项目将始终只使用它在自己的项目中找到的web.config文件。在解决方案的任何其他地方放置任何其他配置文件并不重要。 Web项目只能使用它在自己的项目中找到的内容。如果在另一个项目中有连接字符串,则必须将其复制到Web项目,否则永远不会找到它。

其次,假设Web项目是您的启动项目,并假设您正在使用数据迁移(因为Identity使用它),请注意包管理器将始终使用它在启动项目中找到的连接字符串。因此,update-database的包管理器将不使用模型项目中的连接字符串。

简单的解决方案是:1。将连接字符串从模型项目复制到Web项目。 2.在包管理器控制台中,确保选择上下文的下拉列表指向您的模型项目。

另一答案

问题1: -

我想可以使用以下链接中找到的解决方案: -

Setup Entity Framework For Dynamic Connection String

问题2:-

我相信实体框架构建了当执行时间将使用该项目的web.config时的方式。微软的指示也表明了这一点

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

另一答案

我想我有点迟到了,但对于未来的读者来说,here's读得很好。

以上是关于将ASP.NET Identity模型移动到类库的主要内容,如果未能解决你的问题,请参考以下文章

当我在 asp.net mvc 5 中达到类用户身份时,如何获得新属性?

Asp.Net MVC Identity 2.2.1 使用技巧

Asp.Net MVC Identity 2.2.1 使用技巧

如何有条件地将多个模型映射到 ASP.NET Core Identity 中的一个表(AspNetUsers)?

asp.net core系列 48 Identity 身份模型自定义

从类库访问 Asp.net-core 中的 appsetting.json