带有计时器的单点登录登录页面,用于检查用户是否已登录
Single-SignOn-Loginpage with timer to check if user is already signed in
我们设置了多个需要登录用户的 asp.net 页面。为了尽可能减少管理开销,我们决定构建一种门户页面,用户可以在其中登录。在登录程序之后,他们将被重定向回他们想要导航到的页面。
这工作非常顺利,我们对此感到满意。
速览:
- 所有 "childpages" 检查主控,如果用户已登录。如果没有 -> 重定向到门户
- 子页面和门户通过使用相同的机器验证密钥共享身份验证 cookie
- 认证方式:表单认证
- 已针对活动目录进行身份验证
但有一件事让我有点恼火:用户经常打开我们网站的多个实例(选项卡)。如果他们在登录后打开它们 - 没问题。但如果它们在登录前打开,则在每个选项卡上获取登录页面。没关系,但我的目标是检查时间炸弹,如果用户已经登录。这样用户就可以登录其中一个选项卡,所有其他选项卡都会自动将用户重定向到目标站点,因为他现在已经登录了。
我以前使用过计时器,认为这应该没什么大不了的 - 但我不知道该怎么做。我现在做了什么:
我在我们门户的登录页面中创建了一个计时器。他位于更新面板中,以避免在用户输入他的凭据时重新加载整个页面:
<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:Timer ID="tiUpdater" runat="server" OnTick="GetTime" Interval="1000" />
</ContentTemplate>
</asp:UpdatePanel>
然后我使用 GetTime-Tickevent 执行以下代码:
protected void GetTime(object sender, EventArgs e)
{
if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
{
if (!string.IsNullOrEmpty(Request.QueryString["ReturnURL"]))
{
string sDestinationURL = Request.QueryString["ReturnURL"];
Response.Redirect(sDestinationURL);
}
else
{
Response.Redirect("~");
}
}
}
我知道它非常基础 - 但它足以满足我们的需求。奇怪的是,滴答声似乎按预期进行。但是 'IsAuthenticated'-属性 似乎 return false 只要我不重新加载整个页面。当我重新加载整个登录页面时,我在计时器的第一个滴答声中得到了重定向。
天哪,我现在就去埋葬自己。在回答了你的 'wild guess' 之后,我再次查看了 chrome 控制台,发现有大量关于这个反 xsrf 东西的错误。我不得不承认我对此知之甚少,但是在注释掉所有这些 xsrf 代码之后,它就像一个魅力。
我想我必须多读一点才能理解这个机制。感谢您的宝贵时间!
我们设置了多个需要登录用户的 asp.net 页面。为了尽可能减少管理开销,我们决定构建一种门户页面,用户可以在其中登录。在登录程序之后,他们将被重定向回他们想要导航到的页面。 这工作非常顺利,我们对此感到满意。
速览:
- 所有 "childpages" 检查主控,如果用户已登录。如果没有 -> 重定向到门户
- 子页面和门户通过使用相同的机器验证密钥共享身份验证 cookie
- 认证方式:表单认证
- 已针对活动目录进行身份验证
但有一件事让我有点恼火:用户经常打开我们网站的多个实例(选项卡)。如果他们在登录后打开它们 - 没问题。但如果它们在登录前打开,则在每个选项卡上获取登录页面。没关系,但我的目标是检查时间炸弹,如果用户已经登录。这样用户就可以登录其中一个选项卡,所有其他选项卡都会自动将用户重定向到目标站点,因为他现在已经登录了。
我以前使用过计时器,认为这应该没什么大不了的 - 但我不知道该怎么做。我现在做了什么:
我在我们门户的登录页面中创建了一个计时器。他位于更新面板中,以避免在用户输入他的凭据时重新加载整个页面:
<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:Timer ID="tiUpdater" runat="server" OnTick="GetTime" Interval="1000" />
</ContentTemplate>
</asp:UpdatePanel>
然后我使用 GetTime-Tickevent 执行以下代码:
protected void GetTime(object sender, EventArgs e)
{
if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
{
if (!string.IsNullOrEmpty(Request.QueryString["ReturnURL"]))
{
string sDestinationURL = Request.QueryString["ReturnURL"];
Response.Redirect(sDestinationURL);
}
else
{
Response.Redirect("~");
}
}
}
我知道它非常基础 - 但它足以满足我们的需求。奇怪的是,滴答声似乎按预期进行。但是 'IsAuthenticated'-属性 似乎 return false 只要我不重新加载整个页面。当我重新加载整个登录页面时,我在计时器的第一个滴答声中得到了重定向。
天哪,我现在就去埋葬自己。在回答了你的 'wild guess' 之后,我再次查看了 chrome 控制台,发现有大量关于这个反 xsrf 东西的错误。我不得不承认我对此知之甚少,但是在注释掉所有这些 xsrf 代码之后,它就像一个魅力。
我想我必须多读一点才能理解这个机制。感谢您的宝贵时间!