我有一个ASP.Net网站有多个角色,每个角色可以访问一个单独的目录(即管理员用户可以访问/管理,消费者可以访问/店等),使用共享登录页面。 如果有人访问登陆页面设置为一个目录返回URL他们没有访问(如购物者访问/login.aspx?returnurl=/admin/index.aspx),用户可以成功authentice(登录凭据有效),但他们最终会回到登录页面(他们没有获得他们所请求的页面)。
我该如何选择这个了,这样我就可以显示一条消息,做用户?
我有一个ASP.Net网站有多个角色,每个角色可以访问一个单独的目录(即管理员用户可以访问/管理,消费者可以访问/店等),使用共享登录页面。 如果有人访问登陆页面设置为一个目录返回URL他们没有访问(如购物者访问/login.aspx?returnurl=/admin/index.aspx),用户可以成功authentice(登录凭据有效),但他们最终会回到登录页面(他们没有获得他们所请求的页面)。
我该如何选择这个了,这样我就可以显示一条消息,做用户?
UrlAuthorizationModule.CheckUrlAccessForPrincipal()
是你需要使用测试用户的位置(网页或文件夹)的访问什么( http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal.aspx )
我结束了在登录页面的Page_Load事件中这样做:
if (User.Identity.IsAuthenticated)
{
LoginErrorDetails.Text = "You are not authorized to view the requested page";
}
该思想为,如果经过身份验证的用户在登录页面结束了,他们要么被送往他们为尝试访问他们无权查看的页面结果,或者他们已经验证,然后手动去登录页面(不太可能)。
进一步的行动将是给用户发送到时,他们访问登录页面的相关主页,如果他们已经认证。
一种方法是重写你的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") = "";
}