【问题标题】:Authentication in a multi layer architecture多层架构中的身份验证
【发布时间】:2011-11-26 03:47:32
【问题描述】:

我正在.NET 中设计一个 N 层系统,它将由

  • SQL Server 2008
  • EF 4
  • 存储库层
  • 服务层(业务逻辑)

除此之外,我还有:

  • ASP.NET MVC 网站
  • 其他客户端使用的外部 API(使用 WCF 或 ServceStack.NET 构建)

我想在 MVC 应用程序中实现典型的用户名/密码验证以及 OpenID/twitter/facebook 登录选项

API 将需要类似形式的身份验证。

架构中的哪个位置是实现身份验证的最佳位置,是否有任何可用示例说明如何使用 .NET 堆栈实现类似的功能?

是否可以选择自定义会员提供程序?

我意识到有一些库可用于实现 openID 部分,因此目前这不是问题,但我想保留一些东西以便将来添加它。

建议?

【问题讨论】:

    标签: c# .net asp.net-mvc architecture asp.net-membership


    【解决方案1】:

    基本架构是使用 asp.net 会员 API 来调用同一个会员数据库的服务和 Web 应用程序。然后使用模拟用户连接到 SQL Server。

    然后,您可以为其他身份验证机制编写自定义成员资格提供程序,或将它们全部合并到一个成员资格提供程序中。

    【讨论】:

    • 我想我很困惑..你是说从服务层调用会员 API 吗?如果是这种情况,我是否只使用标准的 SqlMembership 提供程序并跳过这些调用的存储库层?还是我仍然需要滚动自定义提供程序来使用存储库?
    • 在 IIS 级别配置成员资格提供程序,并使用 OOTB SQL 成员资格提供程序使基本身份验证正常工作。然后,您可以编写自定义成员资格
    【解决方案2】:

    应在面向用户的点进行身份验证:MVC 网站和 WCF 服务。

    在每个点中,使用适当的身份验证/授权机制。

    MVC网站:表单认证(或windows认证等)

    WCF 服务:(您将采用什么方法、API 密钥、每个请求的用户/名称密码、安全密钥、身份验证 cookie 等)

    对于每个点,使用请求者(用户)使用的凭据调用服务层,并根据您的数据库(在服务层中)对其进行验证。

    服务层应该返回给它的凭证的有效/无效。

    如果它无效,让您的网站或网络服务拒绝用户的任何进一步操作,并通知他们这是无效的。

    如果它有效,让您的 MVC 网站创建身份验证 cookie (FormsAuthentication.SetAuthCookie) 并且您的 WCF 服务针对您选择的身份验证机制执行适当的操作。

    让您的服务层与身份验证无关。它应该只响应一组凭据是否有效,并且您的前端层应该负责设置身份验证票证。

    对于 Open ID/Twitter/Facebook 登录,所需的所有信息都在网络应用程序上(通过登录源 cookie),因此使用它来设置您网站的身份验证 cookie。

    【讨论】:

      【解决方案3】:

      很抱歉,由于 cmets 中没有足够的空间,因此不得不将其写为另一个答案。

      在 IIS 级别配置成员资格提供程序并使用 OOTB SQL 成员资格提供程序使基本身份验证正常工作。

      然后您可以编写自定义成员资格,存储库层将在 Web 应用程序的上下文中运行,无论是 Web 服务还是 asp.net 站点,因此您的身份验证信息将在 httpcontext 中,然后您可以使用它来连接到您的数据库或使用模拟帐户(即应用程序池用户)进行连接。

      然后,您可以编写一个自定义成员资格提供程序,根据需要对其他提供程序进行身份验证,然后将标准 SQL 替换为您的自定义。

      【讨论】:

        【解决方案4】:

        作为Omar's answer的补充:

        您还可以使用Facade Pattern 来处理授权,并由 WCF 和 MVC 代码使用,并向业务层提供 API。

        经验法则是:将授权放在一个点上,让客户端处理身份验证逻辑。不要将其传播到您的服务层!

        【讨论】:

          猜你喜欢
          • 2017-03-12
          • 2011-03-17
          • 1970-01-01
          • 2012-08-06
          • 1970-01-01
          • 2010-09-27
          • 2020-03-23
          • 1970-01-01
          • 2011-07-03
          相关资源
          最近更新 更多