我对cookie的经验很少,所以我在这里需要一些帮助。
我有一个方案,我必须使用 https 安全性建立与远程终结点的 WCF 连接。客户端配置中的端点地址实际上指向 Web 代理,如果检测到 SSON 身份验证或重定向到身份验证页面,则会将请求重定向到实际端点,因此情况变得复杂。
示例:客户端配置的服务地址为"https://a.com/my.svc"。如果身份验证正常,我将连接到此地址,如果没有,我将被重定向到"https://a.com/auth",成功身份验证后将再次进入"https://a.com/my.svc"
如果我在 Web 浏览器中打开该地址,我将被重定向到身份验证页面,并在成功进行身份验证(登录/pwd)后重定向到该地址。身份验证后,将生成SSON cookie,并且所有后续的地址查询都会将我直接引导至该地址,而无需额外的身份验证。
到目前为止,我已经完成了以下工作:
- 使用 WPF Web 浏览器控件进行身份验证。在那之后我得到了饼干。
已建立客户端终结点连接。是的,该会话在 PROD 环境中默认使用,我不确定是否可以删除它。
<customBinding> <binding name="WSHttpsBinding_IDB2Connector"> <reliableSession inactivityTimeout="23:59:59" ordered="True"/> <httpsTransport requireClientCertificate="false" /> </binding>
直接连接工作正常。我的意思是我不连接到代理地址,而是使用最终端点地址,不使用 cookie。
现在的问题是我如何建立我的WCF连接以使用SSON coookie绕过ClientBase.Open call上的身份验证页面?
一旦你从身份验证表单中获得 SSO cookie,你就可以使用 OperationContextScope 发送 HTTP 标头。
YourServiceClient client = new YourServiceClient();
using(new OperationContextScope(client.InnerChannel))
{
// Add a HTTP Header to an outgoing request
HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
requestMessage.Headers["Cookie"] = "MySSOCookie=MySSOCookieValue"; //SSOCookie content
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
client.doSomething();
}