是否有一种干净的方式来公开需要基本身份验证的WCF REST服务,但我们自己处理用户名/密码的实际验证?似乎当您在配置中告诉WCF要使用基本身份验证时,它会强制您在IIS中启用基本身份验证,而IIS只能对窗口帐户执行基本身份验证。
我们发现的唯一黑客是骗取WCF并告诉它服务上没有安全性,然后使用通用的IHttpModule(它有一个专有的配置文件来指示哪些URL有哪些URL)在WCF堆栈之外进行身份验证认证/授权要求)。
似乎应该有更好的方法。有人吗?
答案 0 :(得分:9)
答案 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