65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.22/5 (8投票s)

2010年12月15日

CPOL

3分钟阅读

viewsIcon

89047

downloadIcon

3752

在任何页面上显示登录弹出窗口的技巧,而不是重定向到登录页面

引言

大家好,希望你们一切都好 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 文件。

Global-ASAX.png

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”,我就会显示弹出窗口。

由于创建模态登录弹出窗口不在问题陈述的范围内,所以我跳过这一点,但是您可以在文章中附带的代码示例中找到它。这非常简单。

因此,当单击经过身份验证的链接时,最终屏幕如下所示

Final_screen.png

除此之外,普通链接(未经身份验证的链接)继续正常工作。这只是应用程序的一种外观更改,以防您需要它。

关注点

我附上了一个示例代码,其中包含以下凭据

  • 用户 ID – Guest
  • 密码 – 123456!1

历史

  • 2010 年 12 月 15 日:首次发布
© . All rights reserved.