如何使用AJAX调用WCF服务时对用户进行身份验证?

时间:2010-08-18 03:39:27

标签: ajax wcf wcf-security

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

3 个答案:

答案 0 :(得分:5)

您可以采取许多措施来保护您的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中保留验证票证;

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

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

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

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

答案 1 :(得分:2)

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

这样我的服务层就不需要了解每个访问它的应用程序的用户,只关心交付请求的数据。

asmx webservice负责安全。

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

所以:

ASPX - &gt; ASMX WebService - &gt; WCF

我认为这会给你控制/分离和你要求的安全性吗?

答案 2 :(得分:0)

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