1

最近、IIS7 でホストされている DotNetOpenAuth Web サービスを介して OAuth によって保護されている WCF SOAP Web サービスに取り組んでいます。プロジェクトが機能するようになったことを嬉しく思います。つまり、http で機能します。

次のステップでは、2 つのプロジェクト (コンシューマーとサービス プロバイダー、後者には Web サービスが含まれます) を https に移動します。ただし、これは少し問題を引き起こしています。

コンシューマーから DataApi.svc を呼び出すと、次のエラーが表示されます。

Server Error in '/consumerexample/v2' Application.
--------------------------------------------------------------------------------

The username is not provided. Specify username in ClientCredentials. 
Description: An unhandled exception occurred during the execution of the current web request.     Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The username is not provided. Specify username in ClientCredentials.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[InvalidOperationException: The username is not provided. Specify username in ClientCredentials.]
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +4727747
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +1725
OAuthConsumer.SampleServiceProvider.IDataApi.retrieveTimeTable(String weekVan, String weekTot) +0
OAuthConsumer.SampleServiceProvider.DataApiClient.retrieveTimeTable(String weekVan, String weekTot) in C:\Program Files\TimeTableWebService\consumer\OAuthConsumer\Service References\SampleServiceProvider\Reference.cs:108
OAuthConsumer.<>c__DisplayClass6.<retrieveTimeTable_Click>b__5(DataApiClient client) in C:\Program Files\TimeTableWebService\consumer\OAuthConsumer\GetTimeTable.aspx.cs:76
OAuthConsumer.GetTimeTable.CallService(Func`2 predicate) in C:\Program Files\TimeTableWebService\consumer\OAuthConsumer\GetTimeTable.aspx.cs:129
OAuthConsumer.GetTimeTable.retrieveTimeTable_Click(Object sender, EventArgs e) in C:\Program Files\TimeTableWebService\consumer\OAuthConsumer\GetTimeTable.aspx.cs:76
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +154
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3707

--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.237 

http では、これは魅力的に機能します。コンシューマをローカルでデバッグすると、OAuth 認証全体がうまく機能します。このエラーが発生するのは、DataApi.svc の retrieveTimeTable メソッドが呼び出されたときだけです。

IIS7 では、消費者サイトとサービス プロバイダー サイトの両方で匿名認証と基本認証の両方を有効にしました。web.config ファイルは次のとおりです。

消費者

<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="WSHttpBinding_IDataApi" closeTimeout="00:01:00"
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
     maxBufferPoolSize="524288" maxReceivedMessageSize="999999999" messageEncoding="Text"
     textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">

        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
       maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        <reliableSession ordered="true" inactivityTimeout="00:10:00"
       enabled="false" />

        <security mode="Transport">  
    <transport clientCredentialType="Basic" proxyCredentialType="None" realm=""/>  
    <message clientCredentialType="Certificate" algorithmSuite="Default" /> 
        </security>          

      </binding>
    </wsHttpBinding>
  </bindings>

  <client>
    <endpoint address="https://websrv.hszuyd.nl/serviceprovider/v2/DataApi.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IDataApi" contract="SampleServiceProvider.IDataApi" name="WSHttpBinding_IDataApi">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>        
  </client>
</system.serviceModel>

サービスプロバイダー

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="DataApiBehavior">
        <webHttp />
      </behavior>
      <behavior name="wsHttpEnablingBehaviour">
        <webHttp/>
      </behavior>
    </endpointBehaviors>            

    <serviceBehaviors>  
      <behavior name="DataApiBehavior">
        <serviceMetadata httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
        <serviceAuthorization serviceAuthorizationManagerType="OAuthServiceProvider.Code.OAuthAuthorizationManager, OAuthServiceProvider" principalPermissionMode="Custom" />
      </behavior>
      <behavior name="wsHttpEnablingBehaviour">
        <serviceMetadata httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="false"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

  <bindings>
    <wsHttpBinding>   
      <binding name="wsHttpBinding" maxReceivedMessageSize="999999999">
        <security mode="Transport">
          <transport clientCredentialType="Basic" />    
        </security>
      </binding>               
    </wsHttpBinding>
  </bindings>
  <services>
    <service behaviorConfiguration="DataApiBehavior" name="OAuthServiceProvider.DataApi">
      <clear/>
      <endpoint address="" binding="wsHttpBinding" contract="OAuthServiceProvider.Code.IDataApi" name="Oauth" bindingConfiguration="wsHttpBinding" />               
    </service>
  </services>
</system.serviceModel>

考え?

4

2 に答える 2

0

おそらく、コンシューマ側はプロキシを使用してプロバイダーを呼び出しますが、基本認証に必要なユーザー/パスを指定していません。

于 2012-04-19T13:58:36.920 に答える
0

申し訳ありませんが、わかりません。クライアントは基本認証を使用しないでください。基本認証は、Authorize.aspx ページにのみ使用する必要があります。だから問題は、Webサービス自体がoauthの代わりに基本認証を使用していることだと思いますが、これを解決する方法は今のところありません。エンドポイントの binding="wsHttpBinding" を削除すると機能しません。(私はニコの同僚です)

于 2012-04-19T15:33:49.073 に答える