我目前正在调查WCF以实现将通过IIS运行的RESTful服务。 目前,我们的软件提供了针对各种来源对用户进行身份验证的功能
我们自己的内部用户帐户存储在数据库中
指定的Windows活动目录,如果是身份验证 成功,进行查找以查找哪个内部帐户 winows one链接到
所以我希望它的工作方式是客户端发送带有的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
这似乎对我来说应该是可能的,所以我的问题是
答案 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中的身份验证端点。端点需要基本身份验证。希望这会有所帮助。