【问题标题】:How to authenticate user while calling WCF service using AJAX?如何在使用 AJAX 调用 WCF 服务时对用户进行身份验证?
【发布时间】:2011-03-31 08:14:58
【问题描述】:

我有一个需要从客户端调用的 WCF 服务(ajax 调用)。 我想在 ASPX 页面上使用 ScriptManager 将 ServiceReference 添加到 WCF 服务(或)JQuery ajax 调用到 WCF 服务。我想拒绝匿名用户访问 WCF 服务。在从 JavaScript 调用服务方法之前,有什么方法可以进行用户身份验证?如何保护来自客户端的 WCF 服务调用?

【问题讨论】:

  • 您是否尝试从您的 JavaScript 中对用户进行身份验证?因此,如果用户未通过身份验证,那么服务调用甚至不会进行?对不起,如果我重复你的问题,但我想确保我理解你的要求。谢谢!
  • wcf ajax 服务没有任何安全功能,如 Windows 身份验证、用户名/密码身份验证、x509 证书等。我们必须使用 SSL 在传输级别保护数据,但我想保护我的 wcf ajax以安全方式调用我的意思是我不想让黑客使用 javascript 或欺骗或 temapring 我的网络方法。我不知道该怎么做。
  • 在下面添加了答案/建议。不确定这是否是您要查找的内容,但请告诉我,我可以进行相应更新。

标签: ajax wcf wcf-security


【解决方案1】:

我不确定这是否会有所帮助,但我在 WCF 和 webapp 之间放置了一个层。我会对本地 asmx 进行 AJAX 服务引用调用。这受到表单身份验证票的保护。然后,asmx 将进行任何进一步的安全检查(如果允许进行调用的特定用户请求该数据或根据用户调整数据),然后将调用转发到我的 WCF 服务。

这样,我的服务层不需要了解每个应用访问它的用户,而只关心所请求数据的传递。

asmx 网络服务承担了安全责任。

然后,我使用 WAS 将 WCF 托管在 IIS 中,并且只允许对运行 webapp 应用程序池的身份进行 Windows Auth 访问。

所以:

ASPX -> ASMX WebService -> WCF

我认为这将为您提供您所要求的控制/分离和安全性?

【讨论】:

    【解决方案2】:

    对于 WCF Web http 服务 保护 Web 端点的唯一方法是使用传输安全性通过 HTTPS 公开它。使用基于消息的安全性时,安全信息通常放置在 SOAP 标头中,并且由于发送到非 SOAP 端点的消息不包含 SOAP 信封,因此无处放置安全信息,您必须依赖传输安全性。

    【讨论】:

      【解决方案3】:

      您可以采取多种措施来保护您的 WCF 服务。如果您的服务已经是现有整体 ASP.NET 应用程序的一部分,最简单的方法可能是为您的服务启用 ASP.NET 兼容模式。如果您的 ASP.NET 应用程序使用身份验证来验证用户(例如表单身份验证)并且您通过会话 cookie 启用它,那么 ASP.NET 兼容模式会为您完成大部分工作。

      默认情况下,这是禁用的,但您可以通过添加到 web.config 来启用它:

      <system.serviceModel>
              ...
              <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
              ...
      </system.serviceModel>
      

      这将为您的应用程序中的所有服务启用兼容模式。您还可以通过设置 web.config 值并在服务类而不是接口上使用 AspNetCompatibilityRequirements 属性来逐个服务启用此功能:

      [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
      public class FooService: IFooService {
      }
      

      启用此设置后,您可以访问 HttpContext.Current(如 ASP.NET 页面),并且它还将强制用户在访问 .svc 文件之前必须经过身份验证(就像您之前必须经过身份验证一样访问任何 .aspx 文件)。如果您尝试在未经身份验证的情况下访问 .svc 文件,并且您正在使用表单身份验证,则调用者将被重定向到默认登录页面,并且在成功身份验证后,将被重定向到 .svc 文件。

      这个建议做了一些假设:

      • 您的服务位于 ASP.NET 应用程序中;
      • 您正在使用某种类型的 ASP.NET 身份验证(如表单身份验证)来验证用户的凭据并将验证票证保存在 cookie 中;

      此建议虽然可能不是最安全或最可靠的,但可能是最简单的,至少可以启动并运行并在合理程度上保护您的网站。

      这是一个很好的MSDN library intro article ASP.NET 兼容模式。

      如果可行,下一步也许是研究 HMAC 身份验证之类的东西(这涉及更多工作和密钥的协调 - 但恕我直言,它肯定更安全)。这是一个很好的实现它的演练 - http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/22/how-to-implement-hmac-authentication-on-a-restful-wcf-service.aspx

      我希望这会有所帮助。祝你好运!!

      【讨论】:

      • 您提到了关于 aspNetCompatibility 的好处,但我的 wcf 服务是单独的项目,不在 asp.net 网站应用程序中。我没有使用表单身份验证。我正在数据库级别验证用户。但有会话传递凭据。角色和页面级别的访问权限也在数据库中。
      • 您不必在网站项目中拥有该服务。我在项目中的一些服务上使用 asp.net 兼容性,并且我的服务位于 Web 项目引用的单独 DLL 中。
      • 大卫,拥有兼容模式是个好主意,并提供对 HttpContext 的访问,正如您所提到的,但是它不会阻止您在未通过身份验证时调用该服务。
      猜你喜欢
      • 1970-01-01
      • 2011-10-05
      • 2010-11-15
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 2011-08-29
      • 2014-07-17
      相关资源
      最近更新 更多