我使用post method
通过我的门户网站打开不同的网站,如下所示:
在我的门户网站主页中:
<form method="post" target="_blank" action="">
<input id="Hdn_r" name="Hdn" type="hidden" value="55622">
.....
</form>
然后在any site opened through the portal
的主页面中执行以下检查:
var hr = HttpContext.Current.Request.UrlReferrer;
if (hr != null && !string.IsNullOrEmpty(hr.AbsolutePath))
{
if (Request.UrlReferrer.AbsolutePath.Contains("Portal"))
{
if (Request.Form["Hdn_r"] != null && !string.IsNullOrEmpty(Request.Form["Hdn_r"].ToString())
&& Request.Form["Hdn_a"] != null && !string.IsNullOrEmpty(Request.Form["Hdn_a"].ToString()) &&
Request.Form["Hdn_b"] != null && !string.IsNullOrEmpty(Request.Form["Hdn_b"].ToString()) &&
Request.Form["Hdn_c"] != null && !string.IsNullOrEmpty(Request.Form["Hdn_c"].ToString())
)
{
Session["emp_num"]= int.Parse(Request.Form["Hdn_r"].ToString());
//...........
我的问题是:
如何在我的门户网站的注销按钮中点击一下,从所有已打开的网站注销?
假设我通过我的门户打开了三个网站,我希望当我退出(在门户网站中)从所有打开的应用程序中注销我?
注意:门户网站中的不同网站在不同的服务器上发布。
答案 0 :(得分:4)
在您的所有网站中创建一个退出页面。然后,当您要注销时,使用ajax调用这些注销页面。或者将httprequests发送到该注销页面。您无法直接注销,因为它们不在同一个域中,并且一个站点无法更改另一个站点的会话。
答案 1 :(得分:2)
为什么不尝试针对所有网站制作正确的POST请求,以便以编程方式登录?
请参阅http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest(v=vs.110).aspx
答案 2 :(得分:2)
你无法在另一个网站上获得一个网站的会话。不同的网站有不同的会话状态。此外,如果您想解决上述问题,请在您的应用程序中使用 Cookies 。 Cookie详细信息存储在浏览器中,可以在全球范围内访问所有网站。当您登录门户网站时,使用您的登录凭据创建一个cookie,如果您点击网站门户网站上提供的任何网站链接,请使用您的cookie信息登录。最后,如果您点击任何注销按钮,请清除您的cookie信息。试试吧。
答案 3 :(得分:2)
第一个问题是你如何管理你的连接。 ?
有一件事可能是在任何页面的前端控制器中检查的状态标志,如果该标志为false,则重定向到登录页面并且您将终止所有会话数据。
答案 4 :(得分:2)
你真的有一个“登录”意味着什么的概念吗?
据我所知,您的用户只是通过隐藏的Session变量登录 - 所以只要他关闭任何这些页面的浏览器窗口,他就不再登录了。因为如果他打开了没有隐藏会话变量的页面变量他没有登录。
我会像大多数SSO解决方案一样(例如Shibboleth) - 没有“退出”这样的东西,你有一个活跃的会话,在这个会话中,你被SSO服务识别为某个用户,验证你的凭据 - 当您关闭此会话并打开一个新会话,您必须再次进行验证。如果您未再次验证,则在新会话中以匿名用户身份访问该页面 - 就用户体验而言,与“已注销”相同
注销通常只是删除cookie(如果cookie正在使用,即使然后并非总是如此),并使服务器上的当前会话令牌无效。但对于许多服务(尤其是单点登录解决方案)而言,情况并非如此,这些服务只是让用户相信他已经“退出”,将他重置为新的会话,而他尚未通过SSO服务器进行验证。
答案 5 :(得分:1)
如果不详细了解您的实施方法,您可以按名称打开一个新窗口,并将其名称作为表单目标(sample),您需要进行以下更改:
更新您的登录按钮以使用javascript发布:
// holds the list of opened websites, used later for logout.
var openedWebsites = [];
function login(siteName) {
openedWebsites.push(siteName);
var windowName = siteName + "_window";
//assuming you name your forms as "{sitename}_loginForm"
var loginForm = siteName + "_loginForm";
var form = document.getElementById(loginForm);
form.target = windowName;
window.open("",windowName);
form.submit();
}
然后让您的注销按钮向每个窗口发布注销请求:
function logout(){
for(var x=0;x<openedWebsites.length;x++){
var siteName = openedWebsites[x];
var windowName = siteName + "_window";
//assuming you name your forms as "{sitename}_logoutForm"
var logoutForm = siteName + "_logoutForm";
var form = document.getElementById(logoutForm);
form.target = windowName;
form.submit();
}
}