0

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

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

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

  3. 另一个 LDAP 服务器,例如 Novell

所以我希望它工作的方式是客户端通过 SSL 发送带有身份验证标头(现在基本)的 http(s) 请求,然后服务将使用自定义身份验证来实现上述过程。

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

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

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

我的应用程序配置;

<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. 如果是这样,我做错了什么?或者如果不是,哪种解决方法最好?
4

2 回答 2

2

好的,经过 Andrew Church 的大量谷歌搜索和提示(感谢 Andrew),我已经弄清楚了。

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

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 的参数,我不知道在哪里可以找到它,所以进一步搜索返回这里;

我应该在 netsh.exe 中使用什么 appid?

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

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

于 2012-08-03T13:04:44.190 回答
0

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

于 2012-08-02T19:36:04.420 回答