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 アカウントを持っていることを確認してください。」というメッセージが表示されます。