使用WCF和实体框架在分层应用程序中实现身份验证和授权的最简单方法

时间:2011-03-22 18:15:22

标签: .net wcf web-services entity-framework architecture

我正在设计(并将实施)用于“任务管理”的分层应用程序 我想使用ASP.NET MVC(不是条件)并使用WCF(任何类型的Web服务)进行服务器和客户端之间的通信(= mvc情况下的数据库和控制器)。我想用WCF制作它,因为稍后可能会有一个桌面客户端(它可能只提供部分功能,但仍然......)。 到目前为止,我有几个层次:

----服务(业务逻辑) - WCF
---存储库
- ORM:实体框架
- DB:MsSQL

这应该是整个系统的基础(或者说是服务器)。客户端应该是ASP.NET MVC或Silverlight中的Web应用程序,也应该是桌面应用程序(无论是什么技术.. silverlight,form ..甚至Adobe Flex)。

到目前为止的主要问题:

  1. 我不知道什么是更好(更容易):尝试以某种方式实现默认的asp.net成员资格并以某种方式将其粘贴到我的表中以执行任务(和项目等)。或者我应该尝试修改asp.net成员资格以使用我自己的用户表?我需要用户能够在我的应用程序内更改其详细信息或创建新用户等(而不是使用ASP.NET配置工具)。所以我想,我需要找到一些简单的方法如何使用asp.net成员资格,但是我的用户表。

  2. 我不知道在哪里以及如何对用户进行身份验证和授权。我喜欢在控制器上使用属性,也就是说,除非用户在某个组中,否则无法访问该控制器。但我想,就这样,我只会保护我的客户端,但服务器仍然不安全。因此,当有人获得服务的地址时,他可以调用它并获取数据。我不知道在这种情况下保护服务的最简单方法是什么。我是否应该为每个服务的操作添加一个额外的参数,这将提供用户名和密码,每次服务检查?我不认为这是一个正确的解决方案。

  3. 我真的很困惑...因为有太多不同类型的协议,服务和类型。我迷失了。同样从我到目前为止看到的,趋势是关于REST。这当然很酷,有很棒的视觉工作室模板,如WCF数据服务,当我只提供我的实体上下文,我得到了工作CRUD应用程序。但是我没有创建公共服务,我为所有用户提供了一个包含数据的存储空间,每个用户只能看到他的数据。

    3 - 有一种简单的方法,如何从Entity Framework生成可序列化的实体?我已经阅读了几个关于'metal'工具的段落,它可以使LINQ to SQL实体可序列化,我可以传输它们。我只是想知道是否有更好的方法,然后将我的所有实体重写为复合类型(重新映射的批次)。

    对不起,如果这看起来太混乱了。我是.Net的新手,有太多的技术和原则,所以很难一次性消耗它。我也可能错过了一些关系和明显的解决方案......

    感谢任何可能的提示

1 个答案:

答案 0 :(得分:0)

我们使用类似的架构,但使用NHibernate而不是EF。

  1. ASP.NET成员资格提供程序旨在支持您正在讨论的方案。您可以创建自己的System.Web.Security.MembershipProvider子类。这允许您映射所有函数以对您自己的表进行操作。

  2. 你绝对正确 - 这需要在服务器上进行。您需要查看System.IdentityModel.Policy.IAuthorizationPolicy。此接口允许您自定义WCF服务的授权处理。这可以基于名称/密码,Windows身份验证甚至基于声明的授权。

  3. 无法帮助EF序列化 - 但是对于NHibernate,我们有两个选择:i)创建DTO以在线上传输并映射到DTO或从DTO映射,或ii)创建自定义序列化器以处理循环引用等我们走了第二条路。

  4. 我唯一的另一个建议是质疑你是否需要存储库层,如果你正在使用EF。为什么不让服务实现逻辑直接处理EF?