wcf通过https进行邮件安全性的userName身份验证

时间:2015-07-03 08:24:55

标签: c# wcf security

在这种情况下,我希望许多客户使用https上的用户名验证来调用我的Web服务。安全性是首要任务,因此我正在考虑将wshttpbinding与消息安全性结合使用。我不知道我的想法是否正确。 问题是我已经有了可行的东西,但我不知道它是否需要改变才能获得更好的安全性。 这就是现在所做的。

<services>
  <service name="myService" behaviorConfiguration="myBehavior" >
    <endpoint address="" binding="basicHttpBinding" contract="myIService" bindingConfiguration="RequestUserName_BasicHttp" >
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8080/myService/" />
      </baseAddresses>
    </host>
  </service>
</services>

<bindings>
  <basicHttpBinding>
    <binding name="RequestUserName_BasicHttp">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Basic"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

 <serviceCredentials>
   <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="myvalidator, myNamespace"/>
 </serviceCredentials>

所以,通过这种方式(有效)我​​认为我没有最好的安全性(至少我需要通过https发送请求)。我能做些什么来实现更好/最好的安全性?我尝试过使用wshttpbinding和https但我在证书方面遇到了一些问题。 开发环境是Windows XP,VS2010,IIS7.5 express。 并且有一个描述服务的类库和一个用于使用它的consoleClient应用程序...客户端有自己的app.config文件,其中有凭据(用户名和密码)。

2 个答案:

答案 0 :(得分:0)

您已经在实施用户ID和密码验证,如果要对邮件执行加密和解密,则必须使用带有HttpsBinding或WsHttpBinding的证书。有关wcf中的身份验证和授权的更多信息,请参阅此MSDN documentation

答案 1 :(得分:0)

好的,我考虑了Ramesh Babu的回答,我改变了一点我的项目。 因此,我没有为wcf服务创建类库,而是创建了一个WCF服务应用程序(在VS2010中有这个选项)。其他所有内容保持不变,所以我创建了一个像这样的新Web.config文件

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="MyBinding">
                    <security mode="Message">
                        <message clientCredentialType="UserName"/>
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <services>
            <service behaviorConfiguration="MyBehavior" name="myName">
                <endpoint address="myService.svc" binding="wsHttpBinding"
                          bindingConfiguration="MyBinding"
                          contract="myService.ImyService" />
                <endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:44400/" />
                    </baseAddresses>
                </host>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="MyBehavior">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebugincludeExceptionDetailInFaults="true" />
                    <serviceCredentials>
                        <userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="myService.Authentication.CustomValidator, myService" />

                        <serviceCertificate
                            findValue="MyCertificate"
                            x509FindType="FindBySubjectName"
                            storeLocation="LocalMachine"
                            storeName="My" />

                    </serviceCredentials>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    </system.serviceModel>

    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
        <directoryBrowse enabled="true"/>
    </system.webServer>

    <connectionStrings>
        <add name="myEntities" connectionString="......" />
    </connectionStrings>

</configuration>

所以我需要创建一个证书,我使用SelfCert创建一个证书并将其复制到TrustedPeople(在运行中键入mmc)。 在此之后,我创建了一个控制台应用程序以使用该服务,app的app.config文件是自动构建的。