4

WCF Web サービス (.Net 4.5 RTM) があります。

カスタムの IPrincipal と IIdentity の実装を提供したいので、カスタムの ServiceAuthenticationManager を提供することにしました。

奇妙なことに、ServiceAuthenticationManager はインスタンス化されていますが、Authenticate メソッドは呼び出されていません。

したがって、このようなサーバー構成がある場合

<system.serviceModel>
    <protocolMapping>
        <add scheme="https" binding="basicHttpBinding" />
    </protocolMapping>

    <behaviors>
        <serviceBehaviors>
            <behavior name="EntityServiceBehavior">
                <serviceAuthenticationManager
                    authenticationSchemes="None"
                    serviceAuthenticationManagerType="Belrost.Communication.EntityServiceAuthenticationManager, Belrost.Communication" />
                <serviceAuthorization
                    impersonateCallerForAllOperations="false"
                    principalPermissionMode="Custom"
                    serviceAuthorizationManagerType="Belrost.Communication.EntityServiceAuthorizationManager, Belrost.Communication" />
                <serviceCredentials>
                    <serviceCertificate
                        findValue="test.local"
                        x509FindType="FindBySubjectName"
                        storeLocation="LocalMachine"
                        storeName="My" />
                </serviceCredentials>
                <serviceDebug
                    includeExceptionDetailInFaults="true"
                    httpsHelpPageEnabled="true"
                    httpsHelpPageUrl="https://test.local/service/belrost-help" />
                <serviceMetadata
                    httpsGetEnabled="true"
                    httpsGetUrl="https://test.local/service/belrost-meta" />
            </behavior>
        </serviceBehaviors>
    </behaviors>

    <bindings>
        <basicHttpBinding>
            <binding name="EntityServiceBinding">
                <security mode="Transport">
                    <transport clientCredentialType="None" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>

    <services>
        <service
            name="Belrost.Server.EntityService"
            behaviorConfiguration="EntityServiceBehavior">
            <endpoint
                address="https://test.local/service/belrost"
                binding="basicHttpBinding"
                bindingConfiguration="EntityServiceBinding"
                bindingNamespace="http://schemas.triflesoft.org/"
                contract="Belrost.Communication.IEntityContract" />
        </service>
    </services>
</system.serviceModel>

Authenticate メソッドが呼び出されますが、clientCredentialType="None" のため、認証情報は提供されません。

すべての場所で None を Basic に変更すると、Authenticate メソッドが呼び出されなくなり (ただし、EntityServiceAuthenticationManager コンストラクターのブレークポイントがヒットします)、SecurityTokenValidationException が表示され、「'test' ユーザーの LogonUser が失敗しました。ユーザーが有効な Windows アカウントを持っていることを確認してください。」というメッセージが表示されます。

4

0 に答える 0