1

在我的第一个真正的 DDD 项目中,我对在这种情况下采取哪种课程持怀疑态度......

我有一个分布式架构,其中多个应用程序的用户将只有一个帐户,使他们能够进行身份验证。此帐户可以在我们自己的系统上创建,或者用户可以与我们分享他与 facebook、google 和其他第三方帐户提供商的登录信息。

因此,有一个项目仅用于此目的,控制用户帐户。

这种情况使我在我的模型中采用了这种方法(简化):

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 的用户等等..

对此有什么想法吗?

谢谢!

4

2 回答 2

1

我是 Stackoverflow 的新手,所以不确定如何将其作为“建议”,但我会重新考虑一下你的模型。我认为“用户”严格来说是通过您自己的网站使用您的应用程序的人。该“用户”将按照您的建议通过身份验证,可以通过您自己系统中的帐户,也可以通过 Facebook 和 Google 等 Open ID 或 OAuth ID 提供商。

但是,如果应用程序想要通过 REST 调用访问您的“应用程序”,那么我会让它们通过不同的身份验证机制。在我看来,您提供的是 API 层和软件即服务。我将看看 Twitter、Facebook 或 Google 如何公开它们的 API 以供其他应用程序使用。通常,在对 REST 调用进行身份验证时会涉及到密钥和应用程序 ID。

于 2012-12-26T02:35:40.797 回答
1

这似乎是一个多部分的问题——一部分是关于对象模型和多态性,另一部分是关于架构的。

关于对象模型,在这种情况下使用继承并不理想。每个子类型Account实际上都不会有太多特定的行为或任何行为。唯一的特化是存在不同的数据字段。此外,使用继承会使持久性复杂化。

在架构上,我认为你想要实现的是federated identity。这基本上将用户(身份)的概念与身份验证过程分离。反过来,这允许所有剩余的应用程序代码绕过身份验证问题并仅依赖于用户的身份。查看OpenID以及在 C# 中提供 OpenID 实现的DotNetOpenAuth库。

于 2012-12-26T18:59:32.837 回答