未经授权时如何将用户重定向到 ASP.NET 页面?

Posted

技术标签:

【中文标题】未经授权时如何将用户重定向到 ASP.NET 页面?【英文标题】:How to Redirect Users to an ASP.NET page when not Authorized? 【发布时间】:2011-06-17 14:09:42 【问题描述】:

我需要将我的用户重定向到 AuthError.aspx 页面(“您无权访问此页面”),以防他们通过身份验证但尝试访问他们无法访问的页面(因为角色用于考试)。如果我这样设置 web.config:

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
</authentication>

这是系统的错误行为,因为用户已通过身份验证,无需将他或她重定向到此页面。但是如果我在这里写 AuthError.aspx 而不是 Login.aspx 我怎么能将尚未通过身份验证的用户重定向到登录页面?

【问题讨论】:

我感觉到你对这个的痛苦。我认为这样做会更容易,但我也没有找到解决方案。我不希望经过身份验证但未经授权的用户在已经登录时看到登录页面。 查看这篇文章。 ***.com/questions/14731707/… 【参考方案1】:

在登录页面的 Page_Load 上,您需要检查用户是否已通过身份验证,以及他们是否要将其重定向到您的拒绝访问页面:

protected void Page_Load(object sender, EventArgs e)

    if (User.Identity.IsAuthenticated) // if the user is already logged in
    
            Response.Redirect("~/AccessDenied.aspx");
    

如果您想要更高级一点,您可以检查 ReturnUrl 参数以确定用户是否直接进入该页面(例如通过他们保存到登录页面的书签)并以不同方式处理。这是一个例子:

protected void Page_Load(object sender, EventArgs e)
    
        if (User.Identity.IsAuthenticated)
        

            // if they came to the page directly, ReturnUrl will be null.
            if (String.IsNullOrEmpty(Request["ReturnUrl"]))
            
                 /* in that case, instead of redirecting, I hide the login 
                    controls and instead display a message saying that are 
                    already logged in. */
            
            else
            
            Response.Redirect("~/AccessDenied.aspx");
            
        
    

【讨论】:

+1 因为这个解决方案会起作用。但这是最好的解决方案吗? 优秀 - 完美运行。谢谢。 这是迄今为止我找到的最好的。 在这种情况下,经过身份验证的用户将被重定向到 AccessDenied 页面......但这将适用于所有用户。如果我是管理员并且需要访问该页面怎么办?如果我尝试访问该页面,那么无论如何它都会将我重定向到 AccessDenied... !!! @Lucky - 您可以在此处再次检查以查看用户是否是管理员,如果是,请执行其他操作,而不是重定向到拒绝访问页面。【参考方案2】:

对我来说,解决这个问题的最简单最有益的解决方案是在 Login.aspx 页面中创建另一个部分(面板),其中的内容要显示给经过身份验证(例如登录)的用户说“访问被拒绝”而不是登录表格。当登录的用户点击该页面时,这意味着他们很可能最终来到了这里,因为他们没有通过身份验证来访问将他们重定向到这里的页面。

在登录页面中,我使用这个非常简单的代码来切换面板和登录表单的可见性:

if (Request.IsAuthenticated)

    LoginUser.Visible = false;
    AccessDeniedPanel.Visible = true;

它非常简单而且有效。

【讨论】:

【参考方案3】:

你需要:

1) 启用角色(在 web.config 中):(将 'xxx' 替换为您自己的值)

<roleManager enabled="true">
  <providers>
    <clear />
    <add connectionStringName="ApplicationServices" applicationName="xxx"
      name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" />
    <add applicationName="xxx" name="AspNetWindowsTokenRoleProvider"
      type="System.Web.Security.WindowsTokenRoleProvider" />
  </providers>
</roleManager>

2) 您需要针对特定​​角色限制对网站某些区域的访问。 我今天实际上回答了另一个问题,我解释了如何实现这一点。 Here是链接

【讨论】:

谢谢,但所有这些事情都已经完成了。也许我描述错了,但问题是我使用角色和本地 Web 配置文件来保护文件夹,但我不知道如何将尝试访问不可访问文件夹的用户重定向到正确的 AuthError.aspx 页面。【参考方案4】:

您需要区分身份验证和授权。您的代码 sn-p 指向前者(“我知道这个网站吗”),而不是后者(“我是否允许访问此页面”)。

正如@santiagoIT 所建议的,角色可能是实现所需授权的最佳解决方案。某些控件(例如 LoginView)具有角色感知和身份验证感知功能,因此您可以根据用户所处的角色使用这些控件来显示不同的内容。

一种常见的方法是向不同角色的用户显示不同的菜单,以便他们只看到与其角色相关的菜单 - LoginView 经常用于此目的。

或者,您可以控制单个页面上内容的可见性,再次使用 LoginView,以便未通过身份验证的用户收到一条消息,已通过身份验证但不允许查看页面的用户收到第二条消息,以及既经过身份验证,又允许查看页面查看内容。

如果您只是想重定向经过身份验证但没有查看页面所需访问权限的用户,您还可以检查该用户是否是适当的角色 (Roles.IsUserInRole) 并重定向到“您可以如果没有,则无权访问..”页面。

如果您真的有安全意识,您可能希望将受限菜单/视图方法与每个页面上的授权检查结合起来。

【讨论】:

感谢您的回答,但我宁愿不对这种行为进行编码,而是使用 web.config 实现它。当然我可以检查后面代码中的可访问性,但我想只使用 web.config 来做到这一点。【参考方案5】:

试试这个:

假设您只需要管理员用户来访问您的指定页面,那么在 page_load 中您可以这样写:

if (User.Identity.IsAuthenticated)

   if ( !User.IsInRole("Admin"))
   
        Server.Transfer("~/AccessDeniedPage.aspx");
   


如果您使用路线,您可以这样做:

if (User.Identity.IsAuthenticated)

   if ( !User.IsInRole("Admin"))
   
        Response.RedirectToRoute("AccessDeniedRoute");
   


【讨论】:

【参考方案6】:

您可以像这样设置自定义错误页面:

<system.web>
  <customErrors mode="On">        
    <error statusCode="403" redirect="AuthError.aspx" />      
  </customErrors>
</system.web>

【讨论】:

不幸的是它不起作用。如果我再次使用它,它会打开登录页面,而不是重定向到 AuthError.aspx =(

以上是关于未经授权时如何将用户重定向到 ASP.NET 页面?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net MVC 3 将未经授权的用户重定向到 loginUrl

在 ASP.NET MVC 中重定向未经授权的控制器

当用户在 asp.net mvc3 中未授权时重定向到另一个页面

当用户在 asp.net mvc3 中未授权时重定向到另一个页面

ASP.NET 核心,更改未经授权的默认重定向

将用户重定向到未经授权的页面(临时解决方案)