2

根据 msdn 的建议,我已启用 ASP.Net 身份验证服务。然后,我尝试通过控制台应用程序或 winforms 应用程序使用该服务(通过向我的本地 WCF 服务添加服务引用)。我正在做自定义身份验证和传输安全(所以我正在处理我的AuthenticationService.Authenticating事件,Global.asax它工作正常)。

身份验证本身工作正常,但通过添加服务引用创建的代理不包含该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 我该怎么办?

4

4 回答 4

2

启用此选项后,客户端将确保从给定 Web 服务接收到的所有 cookie 都以透明方式存储并在每个后续请求中正确发送。但有一个问题:cookie 仅在与一个 Web 服务的对话中处理。如果您需要将相同的 cookie 发送到不同的 Web 服务怎么办?

如果您需要将相同的 cookie 发送到多个服务,请阅读这篇文章: http: //megakemp.wordpress.com/2009/02/06/managing-shared-cookies-in-wcf/

于 2012-07-09T21:41:46.143 回答
0

您需要配置绑定以允许 cookie。

<system.ServiceModel>
     <bindings>
            <basicHttpBinding allowCookies="true">
     </bindings>
于 2012-07-09T21:18:11.953 回答
0

显然,当向客户端上的 WCF 服务添加服务引用 (.Net 3.5+) 时,代理类派生自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。但我很可能会完全重新审视我的方法,并使用自定义标头和服务行为来实现我的目标。

于 2012-07-10T14:44:24.157 回答
0

另一种选择是访问底层通道的 cookie 容器,如下所示:

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

要使上述管理器出现,您需要将 AllowCookies 设置为 true,例如:

<system.ServiceModel>
    <bindings>
        <basicHttpBinding allowCookies="true">
    </bindings>
于 2015-08-21T07:20:01.757 回答