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

时间:2011-01-29 00:53:15

标签: asp.net authentication authorization

我需要将我的用户重定向到AuthError.aspx页面(“您无法访问此页面”),以便在对其进行身份验证但尝试访问他们无法访问的页面时(因为该角色)考试)。如果我设置了web.config:

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

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

6 个答案:

答案 0 :(得分:24)

在登录页面的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 :(得分:2)

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

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

if (Request.IsAuthenticated)
{
    LoginUser.Visible = false;
    AccessDeniedPanel.Visible = true;
}

这很简单,很有效。

答案 2 :(得分:1)

你需要:

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是链接

答案 3 :(得分:1)

您需要区分身份验证和授权。您的代码段解决了前者(“我知道这个网站”),而不是后者(“我可以访问此页面”)。

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

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

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

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

如果您确实注重安全,可能需要将受限制的菜单/查看方法与每页的授权检查相结合。

答案 4 :(得分:0)

试试这个:

假设您只需要管理员用户访问您的指定页面,那么您可以在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");
   }

}

答案 5 :(得分:-1)

您可以设置如下自定义错误页面:

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