Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 确定用户是否可以访问请求的页面?_Asp.net_Login_Security Roles - Fatal编程技术网

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

Asp.net 确定用户是否可以访问请求的页面?,asp.net,login,security-roles,Asp.net,Login,Security Roles,我有一个具有多个角色的ASP.Net网站,每个角色都可以使用共享登录页访问单独的目录(即管理员用户可以访问/admin,购物者可以访问/shop等)。如果有人访问登录页面时,返回URL设置为他们无权访问的目录(例如,购物者访问/login.aspx?返回URL=/admin/index.aspx),则用户可以成功进行身份验证(登录凭据有效),但最终返回登录页面(他们无权访问他们请求的页面) 如何获取此信息,以便向用户显示消息?您可以在索引页上重定向他,告诉他无法访问该页;) 如果您有不同的目录,

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


如何获取此信息,以便向用户显示消息?

您可以在索引页上重定向他,告诉他无法访问该页;)

如果您有不同的目录,并且您使用的是asp.net身份验证,这非常容易。 您只需将web.config文件放在每个目录中,并定义可以访问该目录中文件的角色,如下所示:

<authorization>
    <allow roles="shoppers"/>
    <deny  users="?"/>
</authorization>
    <!-- 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>

希望这对你有帮助

一种方法是覆盖aspx表单的OnLoad,并检查是否允许经过身份验证的用户基于角色访问资源。因此,您创建了一个BasePage.cs(在其中定义了一个从System.Web.UI.Page继承的类BasePage),例如,您的所有表单(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;
}
如果您想知道,这里是不允许的:

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

那么,为什么不在登录页面中找到目录呢?如果登录页面可以确定用户试图访问的目录,那么他们可能可以根据角色重定向到正确的页面。如果有人试图转到/admin,并且身份验证成功,您可以检查他们是否有访问权限。如果没有,您可以重定向到基本登录页,指示他们没有访问权限,或者将他们重定向到角色的登录页

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

我最终在登录页面的page\u load事件中执行了此操作:

if (User.Identity.IsAuthenticated)
{
    LoginErrorDetails.Text = "You are not authorized to view the requested page";
}
if ( session("denied") != "" ) {
   message.text = session("denied");
   session("denied") = "";
}
这种想法是,如果经过身份验证的用户最终出现在登录页面,那么他们可能是因为试图访问他们无权查看的页面而被发送的,或者他们已经通过身份验证,然后手动转到登录页面(不太可能)


进一步的操作是,当用户访问登录页面时,如果他们已经通过身份验证,则将其发送到相关主页。

另一个选项是在检查权限时设置会话变量,并在登录页面上显示该变量

所以你可以做:

if(!User.IsInRole("shopper"))
{
    session("denied") = "You don't have access to shop";
    response.redirect("/login");
}
然后在登录页面中:

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

您需要使用什么来测试用户对某个位置(页面或文件夹)的访问()

如何知道他无法访问该页面?我可以确定他扮演什么角色,但不能确定什么角色可以访问请求的页面。你应该做一些类似于级别的事情。如果您具有4级以上的权限,则可以访问该页面。或者,对于角色,您应该在每个页面上指定一个可以访问该页面的特定角色。该网站已经按照与您发布的内容类似的方式进行了设置-但是,您发布的内容似乎并没有以任何方式回答我的问题。好了,现在我知道了,该用户已通过身份验证,但无权查看此页面!我已经编辑了我的回答returnurl指定的页面上的page_load方法没有被激发,因为用户没有得到授权,所以没有得到那么多。这个概念正是我想做的。我总是在页面加载中使用它,不知道是否应该在Init中使用它。我想我们需要一些专家的建议。示例代码位于。这只是部分解决方案,如果您没有可以访问不同页面的不同角色,则最适合。如果您这样做,您可以拥有一个经过身份验证但仍然无法访问ReturnUrl的用户,这可能会导致重定向循环。