我在web.config中设置了带有<location>
标记的ASP.NET网站页面的权限,类似于:
<location path="Users.aspx">
<system.web>
<authorization>
<allow roles="Administrator"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
但是,我还有一个web.sitemap,它基本上包含相同的信息,即哪些用户角色可以查看/访问哪些页面。来自我的web.sitemap的片段:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode title="Home">
... lots of nodes here ...
<siteMapNode url="users.aspx" roles="Administrator" title="users" description="Edit users" />
...
</siteMapNode>
</siteMap>
是否有某种使用web.sitemap 配置访问权限的方式? <location>
标签非常详细,我不想复制此信息。
答案 0 :(得分:1)
可能你正在寻找SecurityTrimmingEnabled。有关详细信息,请参阅此forum post和blog entry。
所以Web.config
限制直接网址输入和Web.sitemap
- 来自正在显示的网址的访问权限
答案 1 :(得分:0)
当然,您可以在web.config中定义SiteMapProvider,并使用CurrentNode属性获取与请求页面相关的SiteMapNode。
首先声明您的siteMap提供程序(web.config):
<siteMap enabled="true" defaultProvider="DefaultXmlSiteMapProvider">
<providers>
<add siteMapFile="Web.sitemap" name="DefaultXmlSiteMapProvider" securityTrimmingEnabled="true" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</siteMap>
使用CurrentNode进行页面访问控制的示例代码(您可以做得更好;)):
bool hasAccess = false;
if (SiteMap.CurrentNode == null)
throw new ApplicationException("Page not present in SiteMap : " + this.Request.Url.AbsolutePath);
if (SiteMap.CurrentNode.Roles.Count > 0)
{
// All roles or no roles
if (SiteMap.CurrentNode.Roles.Contains("*") == true)
{
hasAccess = true;
}
else
{
for (int index = 0; index < SiteMap.CurrentNode.Roles.Count; index++)
{
string role = SiteMap.CurrentNode.Roles[index].ToString();
hasAccess = HttpContext.Current.User.IsInRole(role);
if (hasAccess == true)
break;
}
}
}
注意我添加了所有人角色(*),非常有用。
答案 2 :(得分:0)
这是我自己的SiteMapProvider
的代码,它抛出一个异常,其中被请求的用户页面(节点)无权这样做(他的角色不在节点的角色列表中)
public class XmlSiteMapProvider : System.Web.XmlSiteMapProvider
{
public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node)
{
var roles = node.Roles.OfType<string>();
if (roles.Contains("*") || (roles.Count(r => context.User.IsInRole(r)) > 0))
{
return true;
}
else
{
throw new InsufficientRightsException();
}
}
}
为了实现我自己的角色逻辑,我还制作了自己的RoleProvider
。