集成ASP.NET标识的最佳做法-是否存在?

集成ASP.NET标识的最佳做法-是否存在?,asp.net,.net,entity-framework,entity-framework-6,asp.net-identity,Asp.net,.net,Entity Framework,Entity Framework 6,Asp.net Identity,我在一个新网站上使用ASP.NET Identity,似乎没有太多(任何?)例子说明如何以解耦的方式实现这一点。我不希望我的域模型的DomainUser类必须继承自Microsoft.AspNet.Identity.EntityFramework.User,因此我创建了一个如下所示的类: public class IdentityUser : User { public virtual DomainUser DomainUser { get; private set; } } 我已将A

我在一个新网站上使用ASP.NET Identity,似乎没有太多(任何?)例子说明如何以解耦的方式实现这一点。我不希望我的域模型的
DomainUser
类必须继承自
Microsoft.AspNet.Identity.EntityFramework.User
,因此我创建了一个如下所示的类:

public class IdentityUser : User
{
    public virtual DomainUser DomainUser { get; private set; }
}
我已将ASP.NET标识所需的
DbSet
s移动到与我的域模型相同的派生
DbContext
类中。我已经通过Fluent API将
IdentityUser
单向链接到
DomainUser
,如下所示:

modelBuilder.Entity<IdentityUser>().HasRequired(iu => iu.DomainUser).WithRequiredPrincipal();
modelBuilder.Entity().HasRequired(iu=>iu.DomainUser).WithRequiredPrincipal();
这使我能够将授权和身份验证的关注点与
DomainUser
类中定义的行为分离开来。这比将它们合并到一个类中要好,但仍然感觉很难看。我的域项目中仍有对所需ASP.NET标识程序集的引用。我还可以创建另一个项目,该项目只包含我的IdentityUser类和对我的域程序集的引用,以允许使用导航属性,但这开始让人感到费解

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


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

有一个问题。您可以在中找到它是如何实现的示例。

事实是,如果您要从IdentityUser继承,ASP.NET与身份相关的程序集将随之出现。您不能将标识与ASP.NET分开。问题中的原始示例并没有给您带来太多好处-在大多数情况下,如果您打算在域项目中使用
IdentityUser
,您可能最好只继承
IdentityUser


如果您的域项目确实需要没有ASP.NET相关程序集,那么您可以在web项目中保留与标识相关的类,并在域项目中创建一个单独的
用户
模型,以编程方式链接这两个类,正如所建议的那样。

身份框架仍然是解决身份验证和授权问题的新方法的初始阶段的工作,其覆盖范围更广,适用于不同的功能案例。2013年11月17日发布。若你们每晚都在进行构建,你们会看到在不久的将来,V1.1将会有更多的动态变化。所以,在我看来,现在创建的任何最佳实践在未来都可能不可行。此外,身份框架不需要紧密耦合,您可以使用IoC来工作。但是在这种情况下,您仍然需要引用核心组件,因为所有的合同都在这里定义。1.0是在10月17日发布的,而不是11月17日,在那一天它成为了一个通用的发布包(在此之前它处于发布候选阶段)。换言之,尽管有夜总会,v1.0应该是一个相当可靠的产品。虽然IoC在表示层非常有用,但它并不能打破auth用户模型和域用户模型之间的耦合。更不用说我们剩下的db表只有两个字段,可以说是被域用户表吸收了。我只是惊讶于关于如何“正确”实现这一点的信息如此之少/示例如此之少。即使新的功能和框架已经在预发布阶段,这也不会阻止专家们发布博客文章,说明如何利用它们。我认为这是一件好事,即使它们注定要进化。我的错误就在这个月!!身份验证是一个边缘的交叉关注点,因此,您通常必须遵守不同的规则。虽然从技术上讲,身份验证部分是一个表示层问题,但您必须以某种方式将此身份验证与域授权连接起来,并且您的表示层需要一种存储用于身份验证的数据的方法。因此,如果不实现一个新的ASP.NET身份提供程序来调用身份验证服务(而不是使用EF提供程序),您将面临泄漏。