在我的第一个真正的DDD项目中,我对这个场景中要采取哪种方法感到疑惑......
我有一个分布式架构,其中几个应用程序的用户只有一个帐户可以使他们能够进行身份验证。此帐户可以在我们自己的系统上创建,或者用户可以与我们分享他与Facebook,谷歌和其他第三方帐户提供商的登录信息。
因此,有一个仅用于此目的的项目,即控制用户帐户。
这个场景让我在我的模型(简化)中采用了这种方法:
public class User
{
public User(string name)
{
Id = Guid.NewGuid();
Name = name;
}
public Guid Id { get; protected set; }
public string Name { get; protected set; }
}
public abstract class Account
{
protected Account(User user)
{
Id = Guid.NewGuid();
User = user;
}
public Guid Id { get; protected set; }
public User User { get; protected set; }
}
public class MySystemAccount : Account
{
public MySystemAccount(string email, string password, User user)
: base(user)
{
Email = email;
Password = password;
}
public string Email { get; protected set; }
public string Password { get; protected set; }
}
public class FacebookAccount : Account
{
public FacebookAccount(string facebookId, User user)
: base(user)
{
FacebookId = facebookId;
}
public string FacebookId { get; protected set; }
}
问题是其他应用程序将通过REST服务访问此项目。
所以,我想到了一个单一的/ Authenticate服务,它将为json提供动态表单。它可能是一个带有电子邮件/密码的json,或带有facebookId的json。
但是,如何连接图层?
我考虑过制作一个应用程序服务,但是我一直困扰着谁应该决定发生了什么,我的休息服务应该与应用程序进行通信以及应用程序知道如何处理这个问题,无论何种身份验证它是,来自我自己的域的用户或来自facebook的用户等等。
对此有何想法?
谢谢!
答案 0 :(得分:1)
我是Stackoverflow的新手,所以不确定如何将其作为“建议”,但我会重新考虑你的模型。我认为“用户”是指严格通过您自己的网站使用您的应用程序的人。此“用户”将按照您的建议进行身份验证,可以通过您自己系统中的帐户,也可以通过Facebook和Google等Open ID或OAuth ID提供商进行身份验证。
如果应用程序想要通过REST调用访问您的“应用程序”,那么我会通过不同的身份验证机制。从某种意义上说,您提供的是API层和软件即服务。我将了解Twitter,Facebook或Google如何公开其API以供其他应用程序使用。通常,在验证REST调用时会涉及密钥和应用程序ID。
答案 1 :(得分:1)
这似乎是一个多部分的问题 - 关于对象模型和多态的一部分和关于体系结构的另一部分。
关于对象模型,在这种情况下使用继承并不理想。 Account
的每个子类型根本不会有太多特定行为或任何行为。唯一的专业是存在不同的数据字段。此外,继承的使用会使持久性变得复杂。
在架构上,我认为你想要实现的是federated identity。这基本上将用户(身份)的概念与身份验证过程分离。反过来,这允许所有剩余的应用程序代码绕过身份验证问题并仅依赖于用户的身份。查看OpenID以及在C#中提供OpenID实现的DotNetOpenAuth库。