多层体系结构中的身份验证

时间:2011-09-27 15:16:48

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

我在.NET中设计一个由

组成的N层系统
  • SQL Server 2008
  • EF 4
  • 存储库层
  • 服务层(业务逻辑)

除此之外,我将:

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

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

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

架构中的哪个位置是实现身份验证的最佳位置,是否有任何可用于使用.NET堆栈实现此类内容的示例?

自定义成员资格提供程序是一个选项吗?

我意识到有可用于实现openID部分的库,所以目前不需要关注,但我希望将此事留空,以便将来添加。

建议?

4 个答案:

答案 0 :(得分:2)

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

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

MVC网站:表单身份验证(或Windows身份验证等)

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

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

服务层应该为给定的凭据返回有效/无效。

如果无效,请让您的网站或网络服务拒绝来自用户的任何进一步操作,并告知他们该操作无效。

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

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

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

答案 1 :(得分:0)

基本架构是使用asp.net成员资格api为您的服务和Web应用程序调用相同的成员资格数据库。然后使用模拟用户连接到SQL Server。

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

答案 2 :(得分:0)

由于评论中没有足够的空间,抱歉不得不把它写成另一个答案。

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

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

然后,您可以编写一个自定义成员资格提供程序,如果您愿意,可以针对其他提供程序进行身份验证,只需将标准SQL替换为自定义提供程序。

答案 3 :(得分:0)

作为Omar's answer的补充:

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

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