1

別の WCF サービス (RealService) を参照する WCF サービス (ServiceWrapper) を作成する必要があります。

ServiceWrapper のクライアントが認証リクエストでユーザー名/パスワードを渡すようにします。

ServiceWrapper の操作 RealService を呼び出します。受信したユーザー名/パスワードを Authenticate with RealSerivce に渡し、その Operations を呼び出す必要があります。

Https(SSL/TLS) ではなく、Http でサービスをホストする必要があります。

質問: サービスによって受信されたクライアント資格情報を使用して、Https (SSL/TLS) を使用せずに参照されたサービスで認証する方法を教えてください。

4

2 に答える 2

3

SOAP セキュリティを使用できます。Message と TransportWithMessageCredential の 2 つの SecurityMode があります。

  1. <binding>このようなセクションでセキュリティモード(UserName)を構成する必要があります

    <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="" />
        <message clientCredentialType="UserName" />
    </security>
    
  2. 次に、<behavior>セクションでカスタムバリデーターを指定する必要があります

    <behavior name="CommonBehavior">
        <serviceMetadata />
        <serviceDebug includeExceptionDetailInFaults="True"/>
        <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom"
                 customUserNamePasswordValidatorType="Megatec.MasterTourService.CustomUserNameValidator, Megatec.MasterTourService"/>
    
            <serviceCertificate findValue="WCFServer" storeLocation="LocalMachine" 
                storeName="My" x509FindType="FindBySubjectName"/>
            <clientCertificate>
                <authentication certificateValidationMode="PeerTrust" />
            </clientCertificate>
        </serviceCredentials>
    </behavior>
    
  3. カスタムバリデーターでは、ServiceWrapper のクレジットとして与えられたユーザー名とパスワードにアクセスして保存できます。

    using System.ServiceModel;
    using System.IdentityModel.Selectors;
    namespace MyService
    {
        public class CustomUserNameValidator : UserNamePasswordValidator
        {
            public override void Validate(string userName, string password)
            {
                if (!(userName == "testMan" && password == "pass"))
                    throw new FaultException("Incorrect login or password");
    
                // save your Usermame and Password for future usage.
             }
        }
    }
    
  4. RealService にアクセスする必要がある場合は、以下の例のように、ユーザー名とパスワードを資格情報として使用できます。

    private readonly Dictionary<Type, Object> channelFactoryDictionary = new Dictionary<Type, Object>();
    private ChannelFactory<T> GetChannelFactory<T>() where T : class
    {
        if (channelFactoryDictionary.Keys.Contains(typeof(T)))
            return channelFactoryDictionary[typeof(T)] as ChannelFactory<T>;
    
        var channelFactory = new ChannelFactory<T>("*");
        channelFactory.Credentials.UserName.UserName = userName;
        channelFactory.Credentials.UserName.Password = password;
    
        channelFactoryDictionary.Add(typeof(T), channelFactory);
    
        return channelFactory;
    }
    
于 2012-07-19T11:27:22.380 に答える
1

SSL がオプションでない場合は、SOAP メッセージ セキュリティ (SecurityMode = Message) を使用する必要があります。

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

于 2012-07-18T18:52:37.967 に答える