使用WCF REST服务进行基本身份验证而不是Windows帐户?

时间:2009-03-18 23:08:35

标签: wcf rest

是否有一种干净的方式来公开需要基本身份验证的WCF REST服务,但我们自己处理用户名/密码的实际验证?似乎当您在配置中告诉WCF要使用基本身份验证时,它会强制您在IIS中启用基本身份验证,而IIS只能对窗口帐户执行基本身份验证。

我们发现的唯一黑客是骗取WCF并告诉它服务上没有安全性,然后使用通用的IHttpModule(它有一个专有的配置文件来指示哪些URL有哪些URL)在WCF堆栈之外进行身份验证认证/授权要求)。

似乎应该有更好的方法。有人吗?

5 个答案:

答案 0 :(得分:9)

WCF REST Contrib库启用此功能:

http://github.com/mikeobrien/WcfRestContrib

它还允许您保护个人操作。

答案 1 :(得分:4)

是客户端上设置的用户名和密码,如:

cc.ClientCredentials.UserName.UserName = ReturnUsername();
cc.ClientCredentials.UserName.Password = ReturnPassword();

或者它们是否嵌入在REST消息的主体中?

如果是前者,则可以使用自定义UserNamePasswordValidator: http://msdn.microsoft.com/en-us/library/aa702565.aspx

如果是后者,您可以将服务设置为无安全性,并使用自定义ServiceAuthorizationManager来验证消息的内容: http://msdn.microsoft.com/en-us/library/ms731774.aspx

希望其中一个或另一个有帮助!我试着发布示例代码&配置,但我是@ home并且无法访问代码,这都是@ work。

答案 2 :(得分:4)

Custom Basic Authentication for RESTful services。 Pablo的方法使用通过REST入门工具包提供的拦截器功能来解决问题。如果您不想依赖REST入门工具包,那么您可以创建自己的服务主机并使用提供的交互功能。

答案 3 :(得分:3)

如果您在IIS上托管它,使用自定义http模块是可行的方法。您可以将主体转移到WCF端以执行代码访问安全性。见HTTP Basic Authentication against Non-Windows Accounts in IIS/ASP.NET (Part 3 - Adding WCF Support)。另请参阅Custom HTTP Basic Authentication for ASP.NET Web Services on .NET 3.5/VS 2008

如果您不使用IIS,则应该能够实现userNameAuthentication。请参阅Finally! Usernames over Transport Authentication in WCF

答案 4 :(得分:1)

是的,绝对有办法。您需要为服务配置自定义userNamePasswordValidationMode值,并将其指向具有重写方法的类,该方法可以检查并验证提供的凭据。进行RESTful调用时,以正确形式使用基本身份验证时,这些凭据应位于请求标头中。使用此自定义方法,您可以检查凭据,然后验证客户端到您的服务。甚至不需要Windows帐户或域。

好消息是,您可以将该安全上下文提升到下一级别,并在方法级别提供细粒度身份验证。您可能有大型客户端池能够访问该服务的实例,但不是所有方法(即付费客户端与未付费客户端)。在这种情况下,如果需要,您还可以在方法级别提供授权

以下是我的逐步解决方案(包含太多步骤),其中包含完成完整解决方案所需的配置和安全性。问题通常是使用基本身份验证而不使用SSL证书保护传输,这是错误。确保遵循所有步骤,您将实现基本身份验证,而无需基于WCF RESTful的服务上的任何类型的Windows帐户或配置。

RESTful Services: Authenticating Clients Using Basic Authentication