나는 사용자 이름과 암호 및 인증서를 사용하여 wcf 서비스를 보호하는 자습서를 사용하지 않았습니다. 복수형의 자체 Cert 도구를 사용하여 인증서를 만들고 설치했습니다. 은 메서드를 확인합니다.이 메서드는 UserNamePasswordValidator에서 상속됩니다. 인증서 보안이 제대로 작동하지만 유효성 검사 메소드가 서비스 호출 중에 호출되지 않습니다. 서비스는 사용자 이름과 암호를 제공하지 않고 액세스 할 수 있습니다.
나는 그것에 관한 많은 기사를 읽었지만 동일한 절차가 거기에 제시되어있다. 나도 같은 문제에 대한 다른 스택 오버플로 질문을 읽을 수 있지만 그것을위한 해결책을 찾을 수 없습니다.
인증 코드 여기WCF가 UserNamePasswordValidator에서 유효성 검사 메서드를 호출 할 수 없습니다.
using System;
using System.IdentityModel.Selectors;
using System.ServiceModel;
namespace WcfSecure
{
public class CredentialValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if (userName == null && password == null)
throw new ArgumentNullException();
if (!(userName == "one" && password == "two"))
throw new FaultException("Wrong Credentials!");
}
}
}
서비스 계약.
using System.ServiceModel;
namespace WcfSecure
{
[ServiceContract]
public interface ISecureWebService
{
[OperationContract]
int SecureAdd(int x, int y);
[OperationContract]
int UnSecureService(int x, int y);
}
}
서비스 코드
namespace WcfSecure
{
public class SecureWebService : ISecureWebService
{
public int SecureAdd(int x, int y)
{
return x + y;
}
public int UnSecureService(int x, int y)
{
return x + y;
}
}
}
그리고
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="SecureBinding">
<security mode="Message">
<message clientCredentialType="UserName" establishSecurityContext="true"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors >
<behavior name="CustomBehavior">
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceCredentials>
<serviceCertificate findValue="SecureService"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName"/>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WcfSecure.CredentialValidator, WcfSecure" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="CustomBehavior" name ="WcfSecure.SecureWebService">
<endpoint address="" binding="wsHttpBinding" contract="WcfSecure.ISecureWebService"></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
<host>
<baseAddresses>
<add baseAddress="http://192.168.1.224:84/WcfSecure/SecureWebService"/>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
왜 사용자가 자신의 유효성 검사기를 구현하는지 잘 모르겠습니다. WCF 서비스는 사용자 이름/암호 유효성 검사가 포함 된 인증서로 보안되며 WCF 클래스를 만질 필요가 없습니다. – DeanOC
작동 원리 또는 데모 코드를 알려주십시오. – vikrantx