2012-07-09 60 views
1

我已啓用ASP.Net身份驗證服務,正如msdn所建議的那樣。然後,我嘗試通過控制檯應用程序或winforms應用程序使用該服務(通過向本地WCF服務添加服務引用)。我正在進行自定義身份驗證和傳輸安全性(所以我正在處理Global.asax中的AuthenticationService.Authenticating事件,它工作正常)。WCF身份驗證服務代理 - CookieContainer不可用

身份驗證本身工作正常,但通過添加服務引用創建的代理不包括CookieContainer屬性。當我嘗試將Cookie令牌傳遞給需要驗證的後續服務時,這顯然是一個問題。

此外,在下面的客戶端代碼中,IsLoggedIn()返回false,我猜這與沒有cookie容器存在有關。

ServiceReference1.AuthenticationServiceClient client = 
        new ServiceReference1.AuthenticationServiceClient(); 
bool isLoggedIn = client.Login("test", "test", "", true); //returns TRUE 
bool check = client.IsLoggedIn(); //returns FALSE 

這是我在web.config中服務:

<configuration> 
    <system.web> 
     <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.web.extensions> 
    <scripting> 
     <webServices> 
     <authenticationService enabled="true" 
      requireSSL = "false"/> 
     </webServices> 
    </scripting> 
    </system.web.extensions> 
    <system.serviceModel> 
    <services> 
     <service name="System.Web.ApplicationServices.AuthenticationService" 
      behaviorConfiguration="AuthenticationServiceTypeBehaviors"> 
     <endpoint contract="System.Web.ApplicationServices.AuthenticationService" 
      binding="basicHttpBinding" 
      bindingConfiguration="userHttps" 
      bindingNamespace="http://asp.net/ApplicationServices/v200"/> 
     </service> 
    </services> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="userHttps" allowCookies="true"> 
      <!--<security mode="Transport" />--> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="AuthenticationServiceTypeBehaviors"> 
      <serviceMetadata httpGetEnabled="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    </system.serviceModel> 
</configuration> 

編輯:別的東西我要補充,我做的服務調用Login方法的Fiddler會話,且Cookie是設置併發送回客戶端。但是,我應該怎麼做沒有CookieContainer?

+0

你看這個:http://stackoverflow.com/questions/1777221/using-cookiecontainer-with-webclient-class? – 2012-07-09 21:05:58

+0

該帖子不適用於我的問題。不過謝謝你的想法。 – EkoostikMartin 2012-07-09 21:08:10

回答

0

顯然,在客戶端上添加一個服務引用(.NET 3.5+)到WCF服務時,代理類來自System.ServiceModel.ClientBase。這個類沒有CookieContainer屬性(因爲ClientBase支持沒有Cookie概念的非HTTP協議)。

http://netpl.blogspot.com/2011/11/managing-cookies-in-wcf-client.html

我可以添加一個Web引用來代替,這將使用.NET 2.0的代理類(具有CookieContainer屬性公開)http://msdn.microsoft.com/en-us/library/bb628649.aspx。但我很可能會重新審視我的方法,並使用自定義標題和服務行爲來實現我的目標。

0

您需要配置綁定以允許cookie。

<system.ServiceModel> 
    <bindings> 
      <basicHttpBinding allowCookies="true"> 
    </bindings> 
+0

試過了,沒有工作。 – EkoostikMartin 2012-07-09 21:25:42

+0

Cookie只會傳遞給創建它們的服務。您是否嘗試將其發送給其他服務? – 2012-07-09 21:40:00

+0

不,沒有不同的服務,我只是想把cookie變成一個'CookieContainer' – EkoostikMartin 2012-07-09 21:48:17

2

當啓用該選項,客戶端將確保從給定的Web服務 接受所有Cookie存儲並以透明的方式每個後續請求的發送。 但有一個問題:cookie只能在與一個Web服務的對話中處理。 如果您需要將相同的Cookie發送到不同的網絡服務,該怎麼辦?

如果您需要將相同的cookies發送到多個服務,請閱讀這篇文章:http://megakemp.wordpress.com/2009/02/06/managing-shared-cookies-in-wcf/

+0

非常有用的鏈接, 謝謝! – 2013-02-10 14:01:51

0

另一種選擇是訪問該cookie容器像這樣的基本渠道:

var cookieManager = client.InnerChannel.GetProperty<IHttpCookieContainerManager>(); 
cookieManager.CookieContainer.Add(new Cookie(....)); 

對於上面的經理在場,你需要設置AllowCookies爲true,例如:

<system.ServiceModel> 
    <bindings> 
     <basicHttpBinding allowCookies="true"> 
    </bindings>