确定用户是否可以访问请求的页面?

问题描述:

我有一个ASP.Net网站,它具有多个角色,每个角色都可以访问一个单独的目录(即管理员用户可以访问/ admin,购物者可以访问/购物等),使用共享登录页面。如果有人访问登录页面并将返回URL设置为他们无权访问的目录(例如,购物者访问/login.aspx?returnurl=/admin/index.aspx),则用户可以成功进行身份验证(登录凭据是有效),但他们最终回到登录页面(他们无法访问他们请求的页面)。确定用户是否可以访问请求的页面?

我该如何捡起来,以便我可以显示一条消息来做用户?

我结束了在登录页面的Page_Load事件中这样做:

if (User.Identity.IsAuthenticated) 
{ 
    LoginErrorDetails.Text = "You are not authorized to view the requested page"; 
} 

的思维是,如果通过身份验证的用户在登录页面结束了,他们要么被送往他们的作为的结果试图访问他们没有被授权查看的页面,或者他们已经通过身份验证,然后手动转到登录页面(不太可能)。

当用户访问登录页面时(如果他们已经通过身份验证),还可以将用户发送到相关主页。

您可以重定向他索引页,告诉他,他不能访问该页面)

+0

我如何知道他不能访问该页面? 我可以确定他在哪个角色,但不能访问请求的页面。 – user9659 2009-06-26 11:01:35

+0

那么你应该做出像关卡一样的东西。如果你有4级以上,你可以访问该页面。或者对于角色,您应该在每个页面上指定一个可以访问该页面的特定角色。 – Timotei 2009-06-26 11:53:55

如果你有不同的目录和您正在使用asp.net验证它是很容易的。 所有你需要的是把web.config文件中的每个目录,并确定哪些可以访问文件在该目录中这样的角色:

<authorization> 
    <allow roles="shoppers"/> 
    <deny users="?"/> 
</authorization> 

您可以从this文章获得MSDN

您可以更详细信息设置所有主web.config中像这样:

<!-- Configuration for the "sub1" subdirectory. --> 
     <location path="sub1"> 
     <system.web> 
      <httpHandlers> 
      <add verb="*" path="sub1" type="Type1"/> 
      <add verb="*" path="sub1" type="Type2"/> 
      </httpHandlers> 
     </system.web> 
     </location> 

     <!-- Configuration for the "sub1/sub2" subdirectory. --> 
     <location path="sub1/sub2"> 
     <system.web> 
      <httpHandlers> 
      <add verb="*" path="sub1/sub2" type="Type3"/> 
      <add verb="*" path="sub1/sub2" type="Type4"/> 
      </httpHandlers> 
     </system.web> 
     </location> 
    </configuration> 

这是this文章MSDN :)

编辑:

在您的网页加载方法做到这一点:

if(!User.IsInRole("shopper")) 
{ 
    lblNoAccess.Visible=true; 
    lnkHome.Url="PATH_TO_HOME_PAGE_OF_THIS_ROLS"; 
} 

希望这可以帮助你!

+0

该网站已经按照与您发布的内容相似的方式进行了设置 - 但是,您发布的内容实际上并不以任何方式回答我的问题。 – user9659 2009-06-26 11:25:10

+0

好吧现在我得到了你,使用已验证,但无权查看此页面!我编辑了我的答案 – TheVillageIdiot 2009-06-26 12:03:06

一种方法是重写您的aspx表单的OnLoad,并检查经过身份验证的用户是否被允许根据角色访问资源。所以,你创建例如BasePage.cs(其中你定义一个类的BasePage它继承自System.Web.UI.Page)从所有窗体(ASPX)继承,在你这样做:

protected override void OnLoad(EventArgs e) 
{ 
    InitializeSitemap(); 
    if (SiteMap.CurrentNode != null) 
    { 
     if (!UrlHelper.IsAnonymousAllowed(SiteMap.CurrentNode) && (!HttpContext.Current.User.Identity.IsAuthenticated || !UrlHelper.IsAccesible(SiteMap.CurrentNode))) 
     { 
      // You can redirect here to some form that has a custom message 
      Response.Redirect("~/Forms/Logout.aspx"); 

      return; 
     } 
    } 
    base.OnLoad(e); 
} 

然后在您的UrlHelper类,你需要的是上面使用IsAccessible功能:

public static bool IsAccesible(SiteMapNode node) 
{ 
    bool toRole = false; 

    foreach (string role in node.Roles) 
    { 
     if (role == "*" || HttpContext.Current.User.IsInRole(role)) 
     { 
      toRole = true; 
     } 
    } 

    return toRole; 
} 

下面是IsAnonymousAllowed如果你想知道:

public static bool IsAnonymousAllowed(SiteMapNode node) 
{ 
    return node[AllowAnonymousAttribute] != null ? bool.Parse(node[AllowAnonymousAttribute]) : false; 
} 

好了,你为什么不抓住目录中登录PA GE?如果登录页面可以确定用户尝试访问哪个目录,也许他们可以根据角色重定向到正确的页面。如果有人试图去/管理,并且验证成功,您可以检查他们是否有访问权限。如果没有,您可以重定向到基本着陆页,表示他们无权访问,或者将其重定向到角色的着陆页。

编辑: 您可能可以在控件的LoggedIn事件中进行重定向。

另一种方法是在检查权限时设置会话变量,并在登录页面上显示该变量。

所以,你可以这样做:

if(!User.IsInRole("shopper")) 
{ 
    session("denied") = "You don't have access to shop"; 
    response.redirect("/login"); 
} 

然后在登录页面:

if (session("denied") != "") { 
    message.text = session("denied"); 
    session("denied") = ""; 
} 

UrlAuthorizationModule.CheckUrlAccessForPrincipal() 

是你需要使用测试用户的位置接近(页面或文件夹)什么(http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal.aspx