服务库中的 ASP.NET 标识

Posted

技术标签:

【中文标题】服务库中的 ASP.NET 标识【英文标题】:ASP.NET Identity in Services library 【发布时间】:2014-06-12 04:26:58 【问题描述】:

设置:

为了强制分离关注点,我将我的服务放在我的 MVC 5 项目的一个单独的库项目中,并将我的存储库放在一个单独的 Repositories 项目中。结果,我有一个“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 在我的 Repositories 库中非常容易,因为我可以在其中获得对 System.Web.Security 的引用,但现在,有了 ASP.NET Identity,各种 Microsoft.AspNet .Identity 引用(EntityFramework、Core、Owin 等)对我的库不可用。我想我必须安装相关的 Nuget 包,所以这些是我的问题:

问题:

我应该:

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

    如果是这样,我应该安装哪些软件包才能基本使用 SQL Server db?我假设 Microsoft.AspNet.Identity.Core 和 Microsoft.AspNet.Identity.EntityFramework,但我可能被证明是错误的。

    此设置是否可以从存储库项目中工作?还是 ASP.NET Identity 仅在 MVC 项目中有效?标准项目将所有内容都混杂在一个项目中,即没有像我尝试实现的那样分离关注点。

对不起,如果问题是基本的,但我已经病了一段时间,而 ASP.NET 身份也在此期间发生。

编辑:

我必须将 IdentityModels.cs 文件移动到可供 Repositories 项目访问的 Models 项目中。

问题:迁移仍然可以从那里工作吗?不明白为什么不,但正如我所问的......

【问题讨论】:

【参考方案1】:

我已经按照我在问题中的半建议完成了。它有效,但存在一些问题:

问题:

A.我根据需要在库项目中安装了 Microsoft.AspNet.Identity.[various] Nuget 包。 但是,这立即产生了一个问题,因为 Nuget 包安装了版本 2,而在 MVC 项目中,在创建新项目时安装了版本 1。在 MVC 项目中卸载并重新安装版本 2 Microsoft.AspNet.Identity.[various] 数据包解决了这个问题。

B.由于 A,数据库中的表现在与 ASP.NET Identity 2 表不同步,因此在尝试执行某些操作时会出现大量无效列错误。由于这是一个测试项目,我刚刚从数据库中删除了身份表,删除了迁移文件夹并运行了项目并尝试注册用户。这导致在数据库中重新创建表。不过……

C. AspNetUser 表有一个日期时间字段,它产生了以下错误:

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 问题中的问题编号:

    是的,您应该将 Nuget 包安装到您将从中使用 ASP.NET 标识的任何库中。您可能会遇到使用的 Nuget 包与如上所述创建 MVC 项目时安装的包之间的版本冲突问题。

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

    是的,它确实可以在库项目中使用。

编辑问题:是的,但您必须为该项目启用迁移(我使用包管理器控制台命令: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。

【讨论】:

您是否设法将 signinmanager 分离到一个单独的库中?我在不使用 HttpContext 的情况下获取 OwinContext 时遇到问题。有没有办法在没有请求的情况下访问 OwinContext?【参考方案2】:

您可以在SimpleSecurity 项目中找到分离 ASP.NET 身份和使用存储库的示例。有一个参考应用程序,您可以find the source code here。此实现使用 ASP.NET Identity 2.0。你可以在in this blog找到关于这个实现的讨论。

【讨论】:

以上是关于服务库中的 ASP.NET 标识的主要内容,如果未能解决你的问题,请参考以下文章

更改 ASP.NET SPA 模板中的 ASP.NET 标识代码的原因?

ASP.NET Core 标识:角色管理器没有服务

我需要从 ASP.NET 中调用第三方库中的函数,但不能允许它异步运行

ASP.NET 2.0 中的 Windows 身份验证

asp.net MVC - 我可以从类库中引用视图吗?

ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的权限