我们有一个带有Page_Load
代码的aspx页面,该代码调用第三方的TokenGenerator.aspx
页面来生成SSO令牌
private string GetSSOToken()
{
using (WebClient client = new WebClient())
{
//serverUri is https://theirsite.com/Token.aspx, ssoRequestParam is a NameValueCollection
byte[] responsebytes = client.UploadValues(serverUri.AbsoluteUri, "POST", ssoRequestParam);
var ssoToken = Encoding.UTF8.GetString(responsebytes);
return ssoToken;
}
}
将返回的ssoToken添加到用作iframe src的URL中。最终看起来像这样:
var frameUrl = "https://theirsite.com/SSO.aspx?ssotoken=returnedToken";
frame.Attributes["src"] = frameUrl;
然后页面加载到浏览器中,一切都很顺利。这已经有一段时间了。
现在我们需要添加一种注销SSO.aspx
的方法。在我们的Logout()
方法退出我们的应用程序时,我尝试调用他们的注销页面:
using (WebClient client = new WebClient())
{
var logoutUrl = "https://theirsite.com/SSO.aspx?logout=true";
var s = client.DownloadString(logoutUrl);
}
但注销永远不会发生;他们的应用程序没有显示注销发生,我可以将frameUrl粘贴到浏览器中并查看页面。
作为测试,这适用于注销:
生成frameUrl
。
将frameUrl
复制/粘贴到浏览器中:它加载正常。
在新的单独窗口中粘贴logoutUrl
:注销不会发生,仍然可以加载frameUrl
。
在同一浏览器的另一个标签页中,粘贴logoutUrl
:注销发生,frameUrl
会提供相应的“令牌过期”消息。
所以我猜这是因为第一个WebClient会话与第二个WebClient会话不同......但我不确定如何在注销期间重用第一个会话。