我正在使用一个新网站的ASP.NET身份,并且似乎没有很多(任何?)示例如何以分离的方式执行此操作。我不希望我的域模型的DomainUser
类必须从Microsoft.AspNet.Identity.EntityFramework.User
继承,所以我创建了一个如下所示的类:
public class IdentityUser : User
{
public virtual DomainUser DomainUser { get; private set; }
}
我已将ASP.NET Identity所需的DbSet
移动到与我的域模型as illustrated in this answer相同的派生DbContext
类中。我通过Fluent API将IdentityUser
单向链接到DomainUser
,如下所示:
modelBuilder.Entity<IdentityUser>().HasRequired(iu => iu.DomainUser).WithRequiredPrincipal();
这使我能够主要将授权和身份验证的问题与DomainUser
类中定义的行为分开。这比将它们组合成一个类更好,但它仍然感觉很难看。我仍然在我的Domain项目中引用了所需的ASP.NET Identity程序集。我可以创建另一个项目,该项目仅包含我的IdentityUser类和对我的域程序集的引用以允许导航属性,但这开始让人感到困惑。
我觉得应该有更好,更清晰,更模块化的方式将Identity链接到域而不会导致紧密耦合。
有没有人想出更好的处理方法?我希望能引起ASP.NET身份项目(Hao Kung等)参与者的注意,为此提供方向。
答案 0 :(得分:1)
有一个discussion on decoupling ASP.NET Identity here。您可以在open source project SimpleSecurity中找到有关如何实施的示例。
答案 1 :(得分:1)
事实是,如果你要从IdentityUser继承,那么ASP.NET身份相关的程序集就会出现。您无法将Identity与ASP.NET分开。问题中的原始示例并不会给您带来太大的影响 - 在大多数情况下,如果您要在域项目中使用IdentityUser
,则最好只继承IdentityUser
。
如果您的域项目确实需要没有ASP.NET相关程序集,那么您可以在Web项目中保留与Identity相关的类,并在您的Domain项目中创建一个单独的User
模型,以编程方式链接两个按照建议here。