集成 ASP.NET Identity 的最佳实践——它们存在吗?

Posted

技术标签:

【中文标题】集成 ASP.NET Identity 的最佳实践——它们存在吗?【英文标题】:Best practices for integrating ASP.NET Identity - do they exist? 【发布时间】:2013-11-29 11:19:36 【问题描述】:

我在一个新网站上使用 ASP.NET Identity,但似乎没有很多(任何?)示例说明如何以分离的方式执行此操作。我不希望我的域模型的 DomainUser 类必须从 Microsoft.AspNet.Identity.EntityFramework.User 继承,所以我创建了一个如下所示的类:

public class IdentityUser : User

    public virtual DomainUser DomainUser  get; private set; 

我已将 ASP.NET Identity 所需的 DbSets 移动到与我的域模型 as illustrated in this answer 相同的派生类 DbContext 中。我已经通过 Fluent API 将IdentityUser 单向链接到DomainUser,如下所示:

modelBuilder.Entity<IdentityUser>().HasRequired(iu => iu.DomainUser).WithRequiredPrincipal();

这使我能够将授权和身份验证的关注点与DomainUser 类中定义的行为分开。这比将它们组合成一个类要好,但仍然感觉很难看。我仍然在我的域项目中引用了所需的 ASP.NET 标识程序集。我可以创建另一个项目,它只包含我的 IdentityUser 类和对我的 Domain 程序集的引用以允许导航属性,但这开始让人感到复杂。

我觉得应该有一种更好、更简洁、更模块化的方式来将身份链接到域,而不会导致紧密耦合。

有没有人想出更好的方法来处理这个问题?我希望引起参与 ASP.NET 身份项目 (Hao Kung 等) 的人员的注意,以便在此处提供指导。

【问题讨论】:

身份框架仍然是解决身份验证和授权问题的新方法的初始阶段,它对不同的功能案例具有更广泛的覆盖范围。它于 2013 年 11 月 17 日发布。如果您跟进夜间构建,您将看到在不久的将来随着 V1.1 出现更多动态变化。因此,在我看来,现在创建的任何最佳实践都可能不适用于未来。 另外,Identity Framework 不需要紧耦合,可以使用 IoC 来工作。但是在这种情况下,您需要参考核心程序集,因为所有合同都在其中定义。 1.0 是在 10 月 17 日而不是 11 月 17 日发布的,并且在那一天它成为了一个通用的发布包(在此之前它处于发布候选阶段)。换句话说,尽管可以使用 nightlies,但 v1.0 应该是一个相当完善的产品。虽然 IoC 在表示级别上很有用,但它并不能破坏 auth 用户模型和域用户模型之间的耦合。更不用说我们只剩下一个 db 表,其中只有两个单独的字段可以被域用户表吸收。 我只是惊讶于如何以“正确”的方式做到这一点的信息/示例很少。即使新功能和框架处于预发布阶段,它通常也不会阻止专家发布说明如何利用它们的博客文章。我认为这是一件好事,即使它们注定要进化。 我这个月的错误!! 【参考方案1】:

有一个discussion on decoupling ASP.NET Identity here。您可以在open source project SimpleSecurity 中找到有关其实现方式的示例。

【讨论】:

【参考方案2】:

事实是,如果您要从 IdentityUser 继承,那么与 ASP.NET Identity 相关的程序集就会随之而来。您不能将身份与 ASP.NET 分开。问题中的原始示例对您没有太大帮助 - 在大多数情况下,如果您要在域项目中使用 IdentityUser,您可能最好只从 IdentityUser 继承。

如果您的域项目确实需要没有与 ASP.NET 相关的程序集,那么您可以将 Identity 相关的类留在您的 Web 项目中,并在您的域项目中创建一个单独的 User 模型,并按照建议以编程方式链接这两者here.

【讨论】:

身份验证只是一个跨领域的关注点,因此您经常不得不使用不同的规则。虽然从技术上讲,身份验证部分是表示层的问题,但您必须以某种方式将此身份验证与您的域授权联系起来,并且您的表示层需要一种存储数据以进行身份​​验证的方法。因此,如果不实现新的 ASP.NET 身份提供程序来调用身份验证服务(而不是使用 EF 提供程序),您将会有泄漏。

以上是关于集成 ASP.NET Identity 的最佳实践——它们存在吗?的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft 'Identity Platform' 是不是(轻松)与'(ASP.NET) Identity Framework' - MVC5 & .NET 4.7.2 集成?

asp.net core网关Ocelot的简单介绍& Ocelot集成Identity认证

ASP.NET Identity系列教程运用ASP.NET Identity

如何使用 ASP.NET Core 3.1 将 Android 应用程序集成到 Identity Server 以进行身份​​验证?

ASP.NET Identity 重置密码

ASP.NET Identity系列教程Identity高级技术