我已按照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?
答案 0 :(得分:2)
启用此选项后,客户端将确保从给定的Web收到所有cookie 服务以透明的方式存储并在每个后续请求中正确发送。 但有一个问题:cookie仅在与一个Web服务的对话中处理。 如果您需要将相同的cookie发送到不同的Web服务,该怎么办?
如果您需要将相同的Cookie发送到多个服务,请阅读以下文章:http://megakemp.wordpress.com/2009/02/06/managing-shared-cookies-in-wcf/
答案 1 :(得分:0)
您需要配置绑定以允许cookie。
<system.ServiceModel>
<bindings>
<basicHttpBinding allowCookies="true">
</bindings>
答案 2 :(得分: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。但我很可能会完全重新审视我的方法,并使用自定义标题和服务行为来实现我的目标。
答案 3 :(得分:0)
另一种选择是访问基础渠道的cookie容器,如下所示:
var cookieManager = client.InnerChannel.GetProperty<IHttpCookieContainerManager>();
cookieManager.CookieContainer.Add(new Cookie(....));
要使上述经理出现,您需要将AllowCookies设置为true,例如:
<system.ServiceModel>
<bindings>
<basicHttpBinding allowCookies="true">
</bindings>