设置:
为了强制分离关注点,我将我的服务放在MVC 5项目的一个单独的库项目中,将我的存储库放在一个独立的存储库项目中。因此,我有了一个"MembershipRepository",它基本上保存了使用Membership提供程序的代码。不确定这是否是最好的设计,但它对我有效,并为我的各种服务提供了一个"存储库",他们可以用于任何会员资格的东西。
我正在开发(或者更确切地说是更新)的应用程序,只需要存储登录名和密码,列出用户,查找他们的角色等,所有这些都使用SQL Server数据库。没有花哨的东西。
我的MembershipRepository的接口是(转换为ASP.NET Identity的等效类):
public interface IMembershipRepository
{
IEnumerable<AspNetUser> GetAllUsers();
AspNetUser GetUser(string userName);
string GetUserEmail(string userName);
string[] GetRoles(string userName);
bool IsUserInRole(string userName, string roleName);
void RemoveUserFromRole(string userName, string roleName);
void AddUserToRole(string userName, string roleName);
void UpdateUser(AspNetUser user);
void CreateUser(string userName, string password, string email, bool isApproved, out CreateStatus createStatus);
void DeleteUser(string userName);
}
问题:
在ASP.NET Membership时代,在我的存储库库中实现IMembershipRepository非常容易,因为我可以在其中获得对System.Web.Security的引用,但现在,使用ASP.NET Identity,我的库无法使用各种Microsoft.AspNet.Identity引用(EntityFramework、Core、Owin等)。我想我必须安装相关的Nuget软件包,所以这些是我的问题:
问题:
我应该:
在我的库中安装Nuget包,并在那里使用ASP.NET Identity?
若有的话,我应该安装哪些包来进行SQL Server数据库的基本工作?我假定Microsoft.AspNet.Identity.Core和Microsoft.AspNet.Identity.EntityFramework,但事实可能证明我错了。
从存储库项目来看,这个设置会起作用吗?或者ASP.NET Identity只适用于MVC项目?标准项目把所有的东西都混杂在一个项目中,也就是说,在我试图实现的过程中,没有这样的关注点分离。
很抱歉,如果这个问题是基本的,但我已经因病休假一段时间了,在此期间ASP.NET Identity也发生了。
编辑:
我必须将IdentityModels.cs文件移到存储库项目可以访问的Models项目中。
问题:从那时起,迁移还会起作用吗?我不明白为什么不,但正如我所问的。。。
我已经按照我在问题中半建议的方式进行了。它有效,但有一些问题:
问题:
A。我安装了Microsoft。AspNet。身份根据需要,库项目中的[各种]Nuget包。然而,这立即造成了一个问题,因为Nuget包安装了版本2,而在MVC项目中,在创建新项目时安装了版本1。在MVC项目中卸载并重新安装Microsoft版本2。AspNet。身份[各种]数据包解决了这个问题。
B。由于a,数据库中的表现在与ASP不同步。NET Identity 2表,因此在尝试执行某些操作时会收到大量无效列错误。由于这是一个测试项目,我只是从数据库中删除了Identity表,删除了迁移文件夹并运行了该项目并尝试注册用户。这导致在数据库中重新创建表。然而
C。AspNetUser表有一个日期时间字段,该字段产生以下错误:
The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.
解决方案是手动将AspNetUser表中的任何日期时间字段更改为日期时间2。不确定原因,但推测AspNet Identity 2正在为超出范围的日期字段创建默认值。
在SSMA中手动更改表中的字段后,我可以注册用户、登录和注销。所以一切都在起作用。
回答我自己的问题:
按照我原来SO问题中的问题编号:
是的,您应该在使用ASP的任何库中安装Nuget软件包。NET标识。如上所述,在创建MVC项目时,使用的Nuget包和安装的包之间可能存在版本冲突的问题。
要仅使用SQL Server,您需要安装所有三个软件包,即Microsoft。AspNet。身份Core,微软。AspNet。身份EntityFramework和Microsoft。AspNet。身份OWin。我可能需要最后一个包(Microsoft.AspNet.Identity.Owin),因为我没有编辑自动生成的AccountController,我怀疑它引用了Owin内容,以备您使用。
是的,它确实适用于图书馆项目。
编辑问题:是的,但您必须为该项目启用迁移(我使用软件包管理器控制台命令:启用迁移)。
不管怎样,这很全面地回答了我自己的问题。如果您认为有任何适当的澄清,我仍将不胜感激。
如果使用ASP。NET IDENTITY 2.0(撰写时间:2014年4月28日)!!:
尽管以上内容会起作用,但在某种程度上,存在的问题是你没有得到全部ASP。NET Identity 2.0。这是因为,在撰写本文时(2014年4月),一个新的MVC 5项目是使用ASP创建的。NET Identity 1.0。
获取ASP。NET Identity 2.0在这种情况下,最好的选择是使用Empty模板创建一个新项目,然后使用ASP。NET Identity 2.0示例Nuget包,然后将任何现有工作移到此项目/解决方案中。
最后,移动ASP的各个部分。NET标识到您想要的类库,根据您的关注点分离设计。这是一项额外的工作,但确实有效。
我添加这个编辑是因为我不希望任何人(像我一样愚蠢)在图书馆等之间发生冲突时说"等一下!"
此外,示例还附带了一些有用的额外功能,因为它取代了ASP。NET项目配置工具。
HTH。
您可以找到一个分离ASP的示例。NET标识和SimpleSecurity项目中存储库的使用。这里有一个参考应用程序,您可以在这里找到源代码。此实现使用ASP。NET Identity 2.0。你可以在这个博客中找到关于这个实现的讨论。