为了强制分离关注点,我将我的服务放在一个单独的库项目中,放在我的MVC 5项目中,将我的存储库放在一个单独的Repositories项目中。结果,我有一个" MembershipRepository"基本上保存代码以使用成员资格提供程序。不确定是否是最好的设计,但它适用于我,并提供我的各种服务与"存储库"他们可以用于任何会员资格。
我正在处理(或者更新)的应用程序,只需要存储登录名和密码,列出用户,查找他们所在的角色等等,所有这些都使用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成员资格的时代实现IMembershipRepository在我的存储库中很容易,因为我可以在那里获得对System.Web.Security的引用,但现在,使用ASP.NET Identity,各种Microsoft.AspNet .Intity引用(EntityFramework,Core,Owin等)不适用于我的库。我认为我必须安装相关的Nuget软件包,所以这些是我的问题:
我应该:
在我的库中安装Nuget包,并在那里使用ASP.NET身份?
如果是这样,我应该安装哪些软件包以基本使用SQL Server数据库?我推测Microsoft.AspNet.Identity.Core和Microsoft.AspNet.Identity.EntityFramework,但我可能被证明是错误的。
此设置是否可以从存储库项目中运行?或者ASP.NET Identity只能在MVC项目中工作吗?标准项目伴随着一切混乱到一个项目中,即在我尝试实施时没有这样的关注点分离。
很抱歉,如果问题是基本的,但我已经病了一段时间,并且同时发生了ASP.NET身份。
我必须将IdentityModels.cs文件移动到可以由存储库项目访问的Models项目中。
问题:迁移仍然可以从那里开始工作吗?不知道为什么不,但正如我所问......
答案 0 :(得分:4)
我已经完成了,因为我在我的问题中半建议。它有效,但有一些问题:
一个。我根据需要在库项目中安装了Microsoft.AspNet.Identity。[各种] Nuget包。 但是,这会立即产生问题,因为Nuget软件包安装了版本2,而在MVC项目中,在创建新项目时安装了版本1。在MVC项目中卸载并重新安装版本2 Microsoft.AspNet.Identity。[各种]数据包解决了这个问题。
B中。作为A的结果,数据库中的表现在与ASP.NET Identity 2表不同步,因此在尝试执行某些操作时会出现大量无效列错误。由于这是一个测试项目,我刚从数据库中删除了Identity表,删除了迁移文件夹并运行了项目并尝试注册用户。这导致在db中重新创建表。然而...
℃。 AspNetUser表有一个datetime字段,产生以下错误:
The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.
解决方法是手动将AspNetUser表中的任何日期时间字段更改为datetime2。不确定原因,但可能是AspNet Identity 2正在为超出范围的日期字段创建默认值。
手动更改SSMA中表格中的字段后,我可以注册用户,登录和注销。所以一切正常。
在我的原始SO问题中编写我的问题编号:
是的,你应该在你将使用ASP.NET身份的库中安装Nuget包。您可能会遇到使用的Nuget软件包与创建MVC项目时安装的版本之间的版本冲突问题。
要仅使用SQL Server,您需要安装所有三个软件包,即Microsoft.AspNet.Identity.Core,Microsoft.AspNet.Identity.EntityFramework和Microsoft.AspNet.Identity.OWin。我可能需要最后一个包(Microsoft.AspNet.Identity.Owin),因为我没有编辑自动生成的AccountController,我怀疑在你想要使用它时会引用一些东西。
是的,它在图书馆项目中有效。
编辑问题:是的,但您必须为该项目启用迁移(我使用包管理器控制台命令:Enable-Migrations)。
无论如何,这完全回答了我自己的问题。我仍然感谢您认为合适的任何澄清。
虽然上述方法可行,但在某种程度上,存在的问题是你没有得到满满的 ASP.NET Identity 2.0的好处。这是因为,在撰写本文时(2014年4月),使用ASP.NET Identity 1.0创建了一个新的MVC 5项目。
要在此场景中获取ASP.NET Identity 2.0,最好的选择是使用Empty模板创建一个新项目,然后使用ASP.NET Identity 2.0示例Nuget包,然后将任何现有工作移动到此项目/解决方案中。
最后,根据您关注的设计分离,将ASP.NET身份的各个部分移动到您希望它们的类库中。这是一项额外的工作,但确实有效。
我添加了这个编辑因为我不想让任何人(像我一样愚蠢)走开然后说“坚持下去!”当他们在图书馆之间发生冲突等时
此外,这些示例还带有一些有用的额外功能,因为它取代了ASP.NET项目配置工具。
HTH。
答案 1 :(得分:2)
您可以在SimpleSecurity项目中找到分离ASP.NET标识和使用存储库的示例。有一个参考申请,你可以find the source code here。此实现使用ASP.NET Identity 2.0。您可以找到有关此实施的讨论in this blog。