gpt4 book ai didi

c# - 使用隐藏的站点地图节点来控制访问

转载 作者:行者123 更新时间:2023-11-30 12:46:14 27 4
gpt4 key购买 nike

在我的 Asp.NET C# 应用程序中,我有一个站点地图绑定(bind)到用于站点导航的菜单。为了控制用户访问,我使用了 NHibernate Custom Role Provider by Manuel Abadia ,并在每个 SiteMap 节点上设置 Roles 属性。

<siteMapNode title="Add/Modify Roles" description="Add/Modify User Roles"
url="~/MemberPages/Admin_Roles.aspx" roles="Administrator" />

到目前为止一切正常,但现在我希望有几个网页没有出现在站点地图绑定(bind)菜单上,但仍然使用站点地图节点来控制用户访问。例如,我有一个专供管理员使用的页面,显示数据库中的所有角色 (ViewPage)。在该页面上,我有一个“添加新”按钮,可将用户重定向到另一个页面以添加新角色 (AddPage)。 ViewPage 应该存在于菜单上,而 AddPage 不应该存在,但两者应该共享相同的访问设置(只能由管理员访问)。

我应该如何实现这一目标?我知道我可以在我的 web.config 文件中声明访问设置,但我宁愿避免这种情况,因为会有很多这样的页面。此外,系统管理员将被允许自定义访问规则,例如将其从仅限管理员更改为管理员和版主,因此如果系统可以更改一个站点地图中所有页面的访问规则,将会更加方便。

最佳答案

感谢MikeSmithDev's comment ,我设法找出了一个很好的解决方案。如果其他人遇到同样的问题,这就是我所做的:

在我的 SiteMap 中,我添加了一个自定义属性 HideFromMenu:

<siteMapNode title="Add Page" description="Page to Add stuff"
roles="Administrator" url="~/AddPage.aspx" HideFromMenu="true" />

在我的 Menu 控件中,我添加了 OnMenuItemDataBound 属性:

<asp:Menu ID="Menu1" runat="server" DataSourceID="siteMapSource" 
OnMenuItemDataBound="Menu1_MenuItemDataBound" >

在大师的代码隐藏中:

protected void Menu1_MenuItemDataBound(object sender, MenuEventArgs e)
{
SiteMapNode node = (SiteMapNode)e.Item.DataItem;
if (node["HideFromMenu"] == "true")
{
if (e.Item.Parent != null) //if this item has a parent..
e.Item.Parent.ChildItems.Remove(e.Item); //use parent to remove child..
else
Menu1.Items.Remove(e.Item); //else.. remove from menu itself.
}
}

最后,为了确保用户不会越界访问页面,我在母版页中添加了一些验证..

var authorizedRoles = SiteMap.CurrentNode.Roles; //obtain the list of authorized roles for the current page

if (authorizedRoles == null || authorizedRoles.Count == 0) // no roles defined for this node
isAuthorized = false;
else
{
if (authorizedRoles.Contains("*")) // this page can be accessed by everyone
isAuthorized = true;

if (!isAuthorized)
{
foreach (string authorizedRoleName in authorizedRoles)
{
if (Roles.IsUserInRole(authorizedRoleName) == true)
{
isAuthorized = true;
break;
}
}
}
}

if (!isAuthorized)
Response.End(); // unauthorised user; kill the page.

希望对遇到同样问题的人有所帮助。如果有更好的方法可以达到相同的结果,请告诉我。

关于c# - 使用隐藏的站点地图节点来控制访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20895738/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com