无法使用webHttpBinding在WCF RESTful服务中使用自定义身份验证

时间:2012-08-02 11:19:08

标签: wcf rest authentication

我目前正在调查WCF以实现将通过IIS运行的RESTful服务。 目前,我们的软件提供了针对各种来源对用户进行身份验证的功能

  1. 我们自己的内部用户帐户存储在数据库中

  2. 指定的Windows活动目录,如果是身份验证     成功,进行查找以查找哪个内部帐户     winows one链接到

  3. 另一个LDAP服务器,例如Novell
  4. 所以我希望它的工作方式是客户端发送带有的http请求 通过SSL的身份验证标头(现在基本),然后该服务将使用自定义 用于实现上述过程的身份验证。

    目前我正在自托管服务并尝试获取自定义身份验证 示例工作,它正确启动,但我尝试从浏览器发出请求时得到的所有内容 或者我可以附加身份验证标头的工具

    “错误101(net :: ERR_CONNECTION_RESET):连接已重置。”

    我在自定义身份验证类中设置了一个永远不会到达的断点,所以我猜它是一个问题 配置。

    我的app.config;

    <configuration>
    
    ...
    
    <system.serviceModel>
    
        <bindings>
            <webHttpBinding>
                <binding name="secure">
                    <security mode="Transport">
                        <transport clientCredentialType="Basic"></transport>
                    </security>
                </binding>
            </webHttpBinding>
        </bindings>
    
      <services>
        <service name="CELCAT.RegisterMarker.RegisterMarker" behaviorConfiguration="myServiceBehavior">
          <endpoint address="https://mymachine:8001/servicename" 
                    binding="webHttpBinding"
                    bindingConfiguration="secure" 
                    contract="myServiceContract" />
        </service>
      </services>
    
      <behaviors>
        <serviceBehaviors>
          <behavior name="myServiceBehavior">
            <serviceMetadata httpGetEnabled="True"/>
            <serviceDebug includeExceptionDetailInFaults="True"/>
              <serviceAuthorization serviceAuthorizationManagerType="MyServiceAuthorizationManager, authenticatonassembly" />
    
              <serviceCredentials>
                  <userNameAuthentication userNamePasswordValidationMode="Custom"
                                          customUserNamePasswordValidatorType="servicenamespace, serviceassembly" />
    
                  <serviceCertificate findValue="certname"
                                      storeLocation="LocalMachine"
                                      storeName="My"
                                      x509FindType="FindBySubjectName" />
              </serviceCredentials>
          </behavior>
        </serviceBehaviors>
      </behaviors>
    
    </system.serviceModel>
    </configuration>
    

    我已经阅读了一篇帖子,说我想要做的事情是不可能开箱即用的WCF 为了实现这一点,我需要编写一个自定义模块或请求拦截器,如下所述;

    通过自定义模块进行身份验证; http://custombasicauth.codeplex.com/

    通过请求拦截器进行身份验证; http://www.codeproject.com/KB/WCF/BasicAuthWCFRest.aspx

    这似乎对我来说应该是可能的,所以我的问题是

    1. 我正在尝试做什么?
    2. 如果是的话,我错了什么?或者如果不是哪种解决方案最好?

2 个答案:

答案 0 :(得分:2)

好好用谷歌搜索并提示安德鲁教堂(谢谢安德鲁)我已经想到了这一点。

问题是虽然我已经生成了证书,但我没有将它绑定到端口。可以在以下位置找到帮助生成证书和绑定证书的步骤;

http://www.codeproject.com/Articles/24027/SSL-with-Self-hosted-WCF-Service

然而,这要求你使用httpcfg,这个工具在Windows Vista或7(我的操作系统)上不存在,所以另一个谷歌透露了这篇文章;

http://msdn.microsoft.com/en-us/library/ms733791.aspx

告诉我使用netsh,完美!不太好,因为这需要一个名为appid的参数,我不知道在哪里可以找到这个,所以进一步的搜索引导回到这里;

What appid should I use with netsh.exe?

所以我按照所有步骤,注释掉app.config的证书部分,嘿,我在自定义配置中点击了我的断点。

希望这可以帮助其他人解决同样的问题

答案 1 :(得分:0)

我不确定这是否有效,但我过去所做的是使用自定义HTTP模块。我们的API使用访问令牌,因此我们使用模块检查标头是否存在令牌,如果它不存在,我们将重定向到api中的身份验证端点。端点需要基本身份验证。希望这会有所帮助。