トランスポートセキュリティと基本認証を使用するように構成されたWCFサービスがあります。
このサービスは、iiexpresswithingvs2010でホストされています。
クライアントコードから接続できますが、常に次の情報を受け取ります。
"The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Basic realm=realm'."
そして、これには次のような内部例外があります。
"The remote server returned an error: (401) Unauthorized."
クライアントコードにはすでに回答に設定されている設定がありますが、WCFを使用した基本認証でWebサービスを呼び出すことはできません。
また、IIS / ASP.NETのWindows以外のアカウントに対するHTTP基本認証(パート3-WCFサポートの追加)と前のブログに従って、モジュールとIAuthorizationPolicyクラスを設定しました。
IISExpressは、匿名認証とWindows認証が無効になり、SSLが有効になっているクラシックモードで構成されています。
クライアント構成:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="NotificationHttpBinding">
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://localhost/NotificationService.svc"
binding="basicHttpBinding" bindingConfiguration="NotificationHttpBinding"
contract="NotificationPortType" name="BasicHttpBinding_NotificationPortType" />
</client>
</system.serviceModel>
サービス構成:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service name="Notification.NotificationService" behaviorConfiguration="NotificationServiceBehavior">
<endpoint binding="basicHttpBinding" contract="NotificationPortType" bindingConfiguration="NotificationHttpBinding" >
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="NotificationServiceBehavior">
<serviceMetadata />
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceAuthorization>
<authorizationPolicies>
<add policyType="Notification.HttpContextIdentityPolicy, Notification" />
</authorizationPolicies>
</serviceAuthorization>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="NotificationHttpBinding">
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
<system.web>
<httpModules>
<add name="CustomBasicAuthentication" type="Notification.CustomBasicAuthenticationModule, Notification"/>
</httpModules>
<membership defaultProvider="SampleProvider">
<providers>
<add name="SampleProvider" type="Notification.HardcodedSecurityProviders, Notification" />
</providers>
</membership>
</system.web>
クライアントコードは重要ではありません。
static void Main(string[] args)
{
ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { return true; };
NotificationPortTypeClient client = new NotificationPortTypeClient("BasicHttpBinding_NotificationPortType");
client.ClientCredentials.UserName.UserName = "Test";
client.ClientCredentials.UserName.Password = "PWD";
client.sendNotification(new NotificationRequest());
}
あるいは 、誰かがIIS6を使用してSSL(https)を必要としている間に基本http認証を使用するサービスWCFをホストする方法の代替方法を教えてくれれば、私はそれに満足します!
更新 これはずっと私の犯人だったようです: http401往復を避けてください
ただし、モジュールが(統合モードで)正常に起動したことがわかりましたが、基本的な統合が必要であるがホストで有効になっていないことを示すサービスエラーが表示されました。
iisexpress applicationhost.configファイルを開いて、私が見つけたのは確かです:
<section name="basicAuthentication" overrideModeDefault="Deny" />
に続く
<basicAuthentication enabled="false" />
さらに下へ
これらをに変更しました<section name="basicAuthentication" overrideModeDefault="Allow" />
そして私のweb.configで有効にしようとしました...サイコロなし:(