我有一个具有多个角色的ASP.Net网站,每个角色都可以访问一个单独的目录(即管理员用户可以访问/管理员,购物者可以访问/购物等),使用共享登录页面。如果有人访问登录页面并将返回URL设置为他们无权访问的目录(例如,购物者访问/login.aspx?returnurl=/admin/index.aspx),则用户可以成功验证(登录凭据是有效),但他们最终回到登录页面(他们无权访问他们要求的页面)。
我该怎么选择这个,所以我可以向用户显示一条消息吗?
答案 0 :(得分:12)
UrlAuthorizationModule.CheckUrlAccessForPrincipal()
是您需要用来测试用户对位置(页面或文件夹)的访问权限(http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal.aspx)
答案 1 :(得分:2)
我最终在登录页面的page_load事件中执行此操作:
if (User.Identity.IsAuthenticated)
{
LoginErrorDetails.Text = "You are not authorized to view the requested page";
}
我们的想法是,如果经过身份验证的用户最终登录到登录页面,他们或者是因为尝试访问他们无权查看的页面而被发送的,或者他们已经过身份验证,然后手动转到登录页面(不太可能)。
进一步的操作是在用户访问登录页面时将用户发送到相关主页,如果他们已经过身份验证。
答案 2 :(得分:1)
如果您有不同的目录并且使用asp.net身份验证,则非常容易。 您只需要将web.config文件放在每个目录中,并定义可以访问该目录中文件的角色,如下所示:
<authorization>
<allow roles="shoppers"/>
<deny users="?"/>
</authorization>
您可以从MSDN上的this文章中获取更多详细信息
您可以在主web.config中设置all,如下所示:
<!-- 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上的this文章:)
编辑:
在您的页面加载方法中执行以下操作:
if(!User.IsInRole("shopper"))
{
lblNoAccess.Visible=true;
lnkHome.Url="PATH_TO_HOME_PAGE_OF_THIS_ROLS";
}
希望这能帮到你!
答案 3 :(得分:1)
一种方法是覆盖您的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;
}
以下是IsAnonymousAllowed,以防你想知道:
public static bool IsAnonymousAllowed(SiteMapNode node)
{
return node[AllowAnonymousAttribute] != null ? bool.Parse(node[AllowAnonymousAttribute]) : false;
}
答案 4 :(得分:0)
您可以在索引页面上重定向他,告诉他无法访问该页面;)
答案 5 :(得分:0)
那么,为什么不抓住登录页面中的目录?如果登录页面可以确定用户尝试访问哪个目录,则可以根据角色将其重定向到正确的页面。如果有人试图进入/ admin,并且身份验证成功,您可以检查他们是否有访问权限。如果没有,您可以重定向到基本着陆页,表明他们无权访问,或者您将其重定向到角色的目标网页。
编辑: 您可以在控件的LoggedIn事件中进行重定向。
答案 6 :(得分:0)
另一个选项是在检查权限时设置会话变量,并在登录页面上显示该变量。
所以你可以这样做:
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") = "";
}