【问题标题】:Simplest way of implementing authentication and authorization in layered application with WCF and Entity Framework使用 WCF 和实体框架在分层应用程序中实现身份验证和授权的最简单方法
【发布时间】:2011-03-22 18:15:21
【问题描述】:

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

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

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

目前的主要问题:

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

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

我真的被这个困住了......因为有太多不同类型的协议、服务和类型。我迷失在其中。同样从我目前看到的情况来看,趋势都是关于 REST 的。这当然很酷,并且有很棒的 Visual Studio 模板,比如 WCF 数据服务,当我只提供我的实体上下文并且我得到工作的 CRUD 应用程序时。但我不是在创建公共服务,我有一个存储所有用户的数据,每个用户只能看到他的数据。

3 - 有没有一种简单的方法,如何从 Entity Framework 生成可序列化的实体?我已经阅读了几段关于“金属”工具的文章,它可以使 LINQ to SQL 实体可序列化,我可以转移它们。我只是想知道是否有更好的方法,然后将我所有的实体重写为复合类型(很多重新映射)。

抱歉,如果这看起来太混乱了。我是 .Net 的新手,技术和原理太多了,所以很难一次全部使用。我也可能缺少一些关系和明显的解决方案......

感谢任何可能的提示

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    如果您使用 EF,我唯一的其他建议是质疑您是否需要存储库层。为什么不让服务实现逻辑直接处理 EF?

    【讨论】:

    • 我想让它更松散,所以这就是为什么我正在考虑存储库.. 以提供另一个抽象级别。我知道没有它也可以工作,但我认为没有太多额外的工作来实现它。它可以让一些人开心。感谢您的提示,我会看看他们。
    • @dampe,我们四年前开始构建大型 WCF SOA 应用程序,现在已经投入生产两年了。我们沿着存储库路线走。这是浪费时间,我们一直在逐步删除它。它当时被建议作为各种指导的一部分,但结果证明它是一种抽象,几乎没有增加价值,但却使许多事情变得更加困难。 Ayende 解释得比我好得多:ayende.com/Blog/archive/2011/03/16/…
    • 哦,那好吧。这是您非常宝贵的意见,再次感谢。明天(现在就寝时间)我要看看那篇文章。 [我会将您的答案标记为有用,但没有足够的声誉。]
    • 似乎没有其他人会发表意见。再次感谢 degorolls ;)
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 2022-12-11
    • 1970-01-01
    • 2015-09-26
    • 2016-10-02
    • 2011-01-15
    • 2017-12-10
    • 2016-07-11
    相关资源
    最近更新 更多