2

我正在构建一个用 ASP.NET 和 Flex 编写的基于 Web 的应用程序。我最大的挑战之一是以灵活和可维护的方式实现应用程序的安全性。当涉及不同的技术时,这一挑战变得更加复杂。我将尝试在下面描述我所拥有的。

该网站的布局如下:

  • /mydomain.com/
    • 登录.aspx
    • Default.aspx (宿主 flex [.swf] 应用程序)
    • /行政/
      • 添加用户.aspx
      • 添加角色.aspx
      • 添加权限.aspx
      • ETC...
    • /服务/
      • 安全服务.asmx
      • 地图服务.asmx
      • 照片服务.asmx
      • ETC...

我目前正在使用表单身份验证来保护网站上的资源。不在 /Services/ 文件夹中的所有页面/资源都需要经过身份验证的用户,如果尚未经过身份验证,它们将被重定向到 Login.aspx。.asmx 页面允许未经身份验证的用户。为了保护这些资源,我在 SOAP 方法中抛出了一个异常。这避免了我所知道的任何 SOAP Web 服务客户端都不支持的 SOAP Web 服务重定向页面。最后,SecurityService.asmx 包含一个 Login 方法,允许 Flex 应用程序登录而无需重定向到 Login.aspx 页面,如果 cookie 因任何原因过期。因为建立的 cookie 与任何请求一起发送到服务器,包括来自 Flex 应用程序的请求,所以这似乎工作得很好。

然而,这仍然是一种保护 Web 服务的糟糕方法。我觉得我正在将表单身份验证用于它不打算用于的东西。具体来说,我担心:

  • 当服务与核心网站分离时,此模型将不起作用。这是一个新发现的要求,我相信如果没有更多的修改和技巧,Forms Authentication 将无法正常工作(如果有的话)。
  • Flex 以外的客户可能需要访问服务。其中一些客户端甚至可能无法使用 cookie。如果是这样,该模型立即分崩离析。这不是即时要求,但众所周知,这是长期目标之一。
  • 我们最终会(希望早点而不是晚点)转向基于 REST 的架构(相对于 SOAP),因此任何解决方案都需要适用于 SOAP 和 REST。

所以,我的问题是。

保护基于 ASP.NET、Flex 和 SOAP 或 REST Web 服务构建的应用程序的最佳身份验证和授权机制是什么?

注意:我正在积极研究 OAuth;但是,我很难找到完整的例子来学习。此外,我需要能够根据用户拥有的权限过滤给定用户返回的数据,OAuth 似乎从令牌中删除了用户的身份。因此,我不确定 OAuth 如何应用于细粒度的安全模型。

4

6 回答 6

1

其他人可能不同意,但实际上我认为以您现在的方式处理它并没有什么大问题。这可能是我处理自己的方式,至少一开始是这样。一种或另一种方式,即使是在路上,您可能希望让 Flex 应用程序了解会话的身份验证状态,所以如果这意味着直接检查 ASP.NET 会话令牌,或者您在您设置时设置的其他 cookie设置那个,这似乎是一种很好且可靠的方法。

我确实明白你对服务重定向的意思,但即便如此,使用表单身份验证,它并不是专门处理重定向的服务,而是 ASP.NET 应用程序本身。稍后,如果您需要使用不同的身份验证方案,您可以考虑该方案的具体实现注意事项。除非您通常担心使用表单身份验证,否则可能没有必要仅仅因为 Flex 客户端和 Web 服务而使您的方法复杂化。

于 2009-02-12T17:06:49.323 回答
0

我承认我很少使用 Web 服务,但是需要访问密钥作为soap 标头参数呢?任何可以与soap web 服务通信的客户端应用程序都可能有一个低级别的API 来修改soap 请求,并且使用访问密钥可以(理论上)限制服务的使用。谷歌、亚马逊和其他几家供应商在他们的网络服务中使用这种类型的身份验证,而且看起来效果很好。

这篇文章似乎是一个不错的起点……

于 2009-03-08T16:46:04.297 回答
0

我认为最好有独立的身份验证系统——即使用户和后端的身份验证令牌之间存在关系。它们是不同的野兽,具有不同的能力和要求。

对 flex 部分使用基于正常形式的身份验证。那很好。

对于 Web 服务,您可以创建一个登录方法,该方法返回一些身份验证令牌,供后续任务执行。或者向您的 Web 服务添加一些字段(在标题中或作为参数发布)以每次都使用用户名/密码组合进行身份验证。

附注:我不会依赖肥皂异常来处理身份验证问题。但是,如果您通过 WS 请求发送身份验证令牌或用户/通行证,则无需担心重定向。

编辑:回复:评论-理想情况下有。有满足这些需求的产品(Tivoli 访问管理器),但它们很昂贵。

我提出这个建议是因为它减轻了允许访问替代客户端的痛苦,并且只要您正确设计了服务,它就是无状态的。它还使您可以更精细地控制事物服务端的数据级别访问。

于 2009-03-11T19:49:18.340 回答
0

如果您正在使用或可以使用 WCF,CodePlex 上发布的WCF 安全指南可能会对您有所帮助。

还有微软的 Web Services Enhancements (WSE) 3.0,我相信它实现了一些 WS-* 安全规范。

希望有帮助。

于 2009-03-12T01:20:27.997 回答
0

如果您将服务移动到另一个地方,那么如果两个 Web 应用程序在 web.config 中具有相同的 machineKey,则可以重新使用标准的 ASP.net 身份验证 cookie。

据我所知,FLEX 将尊重 asp.net 身份验证 cookie,因为它将通过浏览器发出 http 请求,浏览器将像普通 http 请求一样传递 http cookie(包括 asp.net 身份验证票)。

您是否尝试过使用普通的 asp.net 身份验证来保护您的网站和服务?

于 2009-03-12T01:50:52.230 回答
0

请参阅Web 服务身份验证 - 最佳实践?

戴夫·邓金写道:

在各种平台上处理它的最简单方法是使用 HTTP 基本身份验证和 HTTPS 作为传输层。如果您的需求超出了简单的用户名/密码,WS-Security 会很好,但平台之间的支持会有很大差异。每个体面的 SOAP 实现都支持 HTTP 身份验证。

和我的 .NET 3.5/VS 2008 上 ASP.NET Web 服务的自定义 HTTP 基本身份验证

于 2009-03-19T07:39:29.530 回答