在表单身份验证中重定向到登录模态弹出窗口而非登录页面






4.22/5 (8投票s)
在任何页面上显示登录弹出窗口的技巧,而不是重定向到登录页面
引言
大家好,希望你们一切都好 J。在开发我的个人网站时,我遇到了一个简单的需求。要覆盖网站中传统的登录方法有点棘手。经过几天的研究,我终于开发了自己的解决方案。我认为我的代码还有很大的改进空间,所以如果有人有更好的方法,请告诉我。
背景
几天前我在 CodeProject 上提出了这个问题 这里,其中指出我有一个网站,其中包含重定向到各个页面的各种链接。在这些页面中,有些是需要身份验证的链接(需要用户登录才能查看),有些是未经验证的链接(对所有人免费,任何人都可以查看)。我在我的网站中使用 SQL 成员资格和表单身份验证。单击经过身份验证的链接会将页面重定向到登录页面。
我想覆盖此功能,使其停留在同一页面并显示一个模态弹出窗口。这意味着如果您单击经过身份验证的链接,您将不会被重定向到登录页面;而是在当前页面上显示一个模态登录弹出窗口。您在弹出窗口中登录,然后被重定向到相应的经过身份验证的页面。此功能将在网站内的任何页面上运行,而无需任何固定的登录页面。
Using the Code
首先,我配置了 web.Config,以使应用程序知道哪些文件需要身份验证,哪些文件不需要。以下是文章中附带的代码中的 XML 片段
<location path ="UnAuthenticatedFiles">
<system.web>
<authorization>
<allow users ="*"/>
</authorization>
</system.web>
</location>
<location path ="WelcomeForm.aspx">
<system.web>
<authorization>
<allow users ="*"/>
</authorization>
</system.web>
</location>
现在,除了上面片段中提到的文件和文件夹之外,其他所有内容都需要通过身份验证。调用任何其他页面都将重定向到登录页面。
注意:在 web.Config 中,我没有提及 LoginUrl
,因为没有固定的登录页面。用户可以在任何页面上登录,因为有登录弹出窗口。
接下来,我添加了 Global.asax 文件。

Application_Error
方法跟踪应用程序错误。我使用它来跟踪页面何时重定向到登录页面。以下是代码片段
protected void Application_Error(object sender, EventArgs e)
{
if (Request.QueryString["ReturnUrl"] != null)
{
if (Request.QueryString["ReturnUrl"].Contains("aspx"))
{
bool val = UrlAuthorizationModule.CheckUrlAccessForPrincipal
(Request.QueryString["ReturnUrl"].ToString(),
HttpContext.Current.User, "GET");
if (val.Equals(false))
{
if (Request.UrlReferrer.AbsolutePath.Equals
(Request.QueryString["ReturnUrl"]))
Response.Redirect("WelcomeForm.aspx");
else
Response.Redirect(string.Format("{0}?ReturnUrl={1}",
Request.UrlReferrer.AbsolutePath, Request.QueryString
["ReturnUrl"].ToString()));
}
else
if (Request.Url.AbsolutePath.Contains("login.aspx") &&
Request.QueryString["ReturnUrl"].Contains("WelcomeForm.aspx"))
Response.Redirect(Request.QueryString["ReturnUrl"].ToString());
}
}
}
当调用 RedirectToLoginPage()
时,它使用“ReturnUrl
”重定向到登录页面。在上面的代码中,我检查是否存在 Return URL 并且是否为 aspx 文件(因为在第一次运行应用程序时它带有 favicon.ico)。
接下来,我使用函数“UrlAuthorizationModule.CheckUrlAccessForPrincipal
”,因为它确定用户是否有权访问请求的文件。它返回布尔值 (true
/false
)。使用该值(如果为 true
,则需要登录),我将请求重定向到同一页面,该页面带有请求页面的 ReturnUrl
(需要身份验证的页面)。
在我的例子中,我使用的是 MasterPage
,所以我已经在 Master 页面上的 Page_Load
中处理了它。Master 页面加载上的代码如下
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.QueryString["ReturnUrl"] != null)
{
bool isFreeToAccess =
UrlAuthorizationModule.CheckUrlAccessForPrincipal
(Request.QueryString["ReturnUrl"].ToString(),
HttpContext.Current.User, "GET");
if (isFreeToAccess.Equals(false) || Request.QueryString
["ReturnUrl"].Contains("WelcomeForm.aspx"))
{
LoginPopupExtender.Show();
}
}
}
}
在这里,我必须执行与 global.asax 中相同的检查,如果 CheckUrlAccessForPrincipal 返回“true”,我就会显示弹出窗口。
由于创建模态登录弹出窗口不在问题陈述的范围内,所以我跳过这一点,但是您可以在文章中附带的代码示例中找到它。这非常简单。
因此,当单击经过身份验证的链接时,最终屏幕如下所示

除此之外,普通链接(未经身份验证的链接)继续正常工作。这只是应用程序的一种外观更改,以防您需要它。
关注点
我附上了一个示例代码,其中包含以下凭据
- 用户 ID – Guest
- 密码 – 123456!1
历史
- 2010 年 12 月 15 日:首次发布