服务库中的ASP.NET标识

时间:2014-04-26 11:42:12

标签: asp.net-mvc asp.net-identity

设定:

为了强制分离关注点,我将我的服务放在一个单独的库项目中,放在我的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软件包,所以这些是我的问题:

问题:

我应该:

  1. 在我的库中安装Nuget包,并在那里使用ASP.NET身份?

  2. 如果是这样,我应该安装哪些软件包以基本使用SQL Server数据库?我推测Microsoft.AspNet.Identity.Core和Microsoft.AspNet.Identity.EntityFramework,但我可能被证明是错误的。

  3. 此设置是否可以从存储库项目中运行?或者ASP.NET Identity只能在MVC项目中工作吗?标准项目伴随着一切混乱到一个项目中,即在我尝试实施时没有这样的关注点分离。

  4. 很抱歉,如果问题是基本的,但我已经病了一段时间,并且同时发生了ASP.NET身份。

    编辑:

    我必须将IdentityModels.cs文件移动到可以由存储库项目访问的Models项目中。

    问题:迁移仍然可以从那里开始工作吗?不知道为什么不,但正如我所问......

2 个答案:

答案 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问题中编写我的问题编号:

  1. 是的,你应该在你将使用ASP.NET身份的库中安装Nuget包。您可能会遇到使用的Nuget软件包与创建MVC项目时安装的版本之间的版本冲突问题。

  2. 要仅使用SQL Server,您需要安装所有三个软件包,即Microsoft.AspNet.Identity.Core,Microsoft.AspNet.Identity.EntityFramework和Microsoft.AspNet.Identity.OWin。我可能需要最后一个包(Microsoft.AspNet.Identity.Owin),因为我没有编辑自动生成的AccountController,我怀疑在你想要使用它时会引用一些东西。

  3. 是的,它在图书馆项目中有效。

  4. 编辑问题:是的,但您必须为该项目启用迁移(我使用包管理器控制台命令:Enable-Migrations)。

    无论如何,这完全回答了我自己的问题。我仍然感谢您认为合适的任何澄清。

    主要编辑如果使用ASP.NET IDENTITY 2.0(撰写时间:2014年4月28日)!!!:

    虽然上述方法可行,但在某种程度上,存在的问题是你没有得到满满的 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