1

我目前正在使用 ADFS 身份验证机制对用户进行身份验证。在这种情况下,我将 authenticationmode 设置为 None 而不是表单身份验证。在用户成功登录后,声明对象将提供与已登录用户关联的角色数据,因此在这种情况下,站点地图角色属性将如何能够从声明对象中获取角色。你能解释一下如何使用 securityTrimmingEnabled 属性吗?

我使用了自定义类 ADFSRoleProvider.cs,它继承了 RoleProvider 类并覆盖了 GetRolesForUser 方法,但除非我设置

<authentication mode="Forms"/>

这反过来也无法与 siteMapNode 节点中提到的角色属性进行交互。

主要问题是在用户使用 ADFS 身份验证机制成功登录后,站点地图角色属性如何知道已登录用户的角色。

请提供一些关于上述问题的代码示例和帮助。

4

1 回答 1

5

您确定需要自定义角色提供程序吗?该IClaimsPrincipal对象为用户提供角色,它接受您的 type 声明ClaimTypes.Role

可能是您的问题是由securityTrimming实施中的一些不一致引起的。几年前,我不得不编写自己的站点地图提供程序来正确处理修剪。

   public class XmlSiteMapDefaultProvider : XmlSiteMapProvider
   {
    public override bool IsAccessibleToUser( HttpContext context, SiteMapNode node )
    {
        if ( node.Roles.Count > 0 )
        {
            foreach ( string role in node.Roles )
                if ( role == "*" &&
                     context.User != null &&
                     context.User.Identity != null &&
                     context.User.Identity.IsAuthenticated
                     )
                    return true;
                else
                {
                    if ( context.User != null )
                        if ( context.User.IsInRole( role ) )
                            return true;
                }

            return false;
        }

        return true;
    }
}

只需将其注册web.config为您的 SiteMapProvider:

<siteMap enabled ="true" defaultProvider="XmlSiteMapDefaultProvider">
  <providers>
    <add name="XmlSiteMapDefaultProvider" type="XmlSiteMapDefaultProvider" siteMapFile="Web.sitemap" securityTrimmingEnabled="true" />
  </providers>
</siteMap>
于 2011-11-18T21:58:03.000 回答