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

我如何选择它,以便我可以向用户显示消息?

有帮助吗?

解决方案 2

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

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

的思考被,如果认证的用户在登录页面结束了,他们要么被发送它们作为试图访问一个页面他们没有被授权查看,或他们已经验证,然后手动去了结果登录页面(不太可能)。

进一步的行动可能是用户发送到时,他们访问登录页面,如果他们已经认证的相关主页。

其他提示

UrlAuthorizationModule.CheckUrlAccessForPrincipal()

是您需要用来测试用户对某个位置(页面或文件夹)的访问( http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal.aspx )

一个办法是重写你的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;
}

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

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

您可以从文章上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>

这是从上MSDN此文章:)

编辑:

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

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

希望这可以帮助你!

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

好了,你为什么不赶在登录页面的目录?如果登录页面可以确定用户试图访问该目录,也许他们可以得到重定向到基于角色的右页。如果有人试图去/ admin,然后验证成功,您可以检查,如果他们有机会在那里。如果没有,你可以重定向到基本的着陆页说明他们没有访问权限,或者你将其重定向到角色的着陆页。

编辑: 你也许可以做重定向在控制的情况下的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") = "";
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top