6

我的 web.config 中有以下内容:

<location path="RestrictedPage.aspx">
    <system.web>
        <authorization>
            <allow roles="Group1Admin, Group3Admin, Group7Admin"/>
            <deny users="*"/>
        </authorization>
    </system.web>
</location>

在 RestrictedPage.aspx.cs 中,如何检索包含 Group1Admin、Group3Admin 和 Group7Admin 的允许角色集合?

这就是我问的原因:

web.config 正在处理对页面的授权。这很好用。但我将有几个这样的页面(比如 RestrictedPage.aspx、RestrictedPage2.aspx、RestrictedPage3.aspx)。这些页面中的每一个都将有我的自定义 web 控件。这些页面中的每一个都将具有不同的允许角色。我的 webcontrol 有一个下拉列表。下拉列表中的选择取决于用户角色和页面允许角色的交集。

如下所述,使用 XPath 搜索 web.config 可能会起作用。我只是希望有更多的框架-y。有点像站点地图。当我将角色放入我的 web.sitemap 时,我可以使用 SiteMap.CurrentNode.Roles 来获取它们(我的网站使用 Windows 身份验证,所以我不能使用 web.sitemap 进行安全调整,我宁愿只保留一个角色文件)。

4

5 回答 5

3
// set the configuration path to your config file
string configPath = "??";

Configuration config = WebConfigurationManager.OpenWebConfiguration(configPath);

// Get the object related to the <identity> section.
AuthorizationSection section = (AuthorizationSection)config.GetSection("system.web/authorization");

从 section 对象获取 AuthorizationRuleCollection 对象,然后您可以在其中提取角色。

注意:您可能需要稍微修改该部分的路径,因为您从“location path="RestrictedPage.aspx"" 开始,我没有尝试这种情况。

于 2008-10-18T00:27:24.850 回答
0
if {User.IsInRole("Group1Admin"){//do stuff}

那是你问的吗?

于 2008-10-17T20:53:05.563 回答
0

我不确定,但我原以为会在您的页面被处理之前进行检查,因此如果用户不是某个角色,他们将永远无法访问您的页面。这最终会使页面中这种冗余的可见性。

于 2008-10-17T20:57:31.733 回答
0

我相信有更好的方法来读取这些信息,但这里有一种方法可以让您从 web.config 文件中读取允许值。

XmlDocument webConfigReader = new XmlDocument(); 
webConfigReader.Load(Server.MapPath("web.config")); 

XmlNodeList root = webConfigReader.SelectNodes("//location[@path="RestrictedPage.aspx"]//allow//@roles"); 

foreach (XmlNode node in root) 
{ 
     Response.Write(node.Value); 
} 

当然,ASP.NET 角色提供程序会为您处理此问题,因此只有当您计划在授权用户旁边的代码隐藏中对它们进行某些操作时,读取这些值才真正相关,您可能正在这样做。

希望这会有所帮助——您可能必须使用 , 字符来拆分结果。

于 2008-10-17T21:05:28.487 回答
0

通常会发生这种情况...

当用户点击您的页面时,如果身份验证/授权处于活动状态,则会引发 Application_Authentication 事件。除非您针对 Active Directory 之类的东西使用 Windows 身份验证,否则您将无法使用 IPrincipal 和 Identity 对象,因此您无法访问 User.IsInRole() 方法。但是,您可以通过将以下代码添加到 Global.asax 文件中来做到这一点:

Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)

      Dim formsAuthTicket As FormsAuthenticationTicket
      Dim httpCook As HttpCookie
      Dim objGenericIdentity As GenericIdentity
      Dim objMyAppPrincipal As CustomPrincipal
      Dim strRoles As String()

      Log.Info("Starting Application AuthenticateRequest Method...")

      httpCook = Context.Request.Cookies.Get("authCookieEAF")
      formsAuthTicket = FormsAuthentication.Decrypt(httpCook.Value)
      objGenericIdentity = New GenericIdentity(formsAuthTicket.Name)
      strRoles = formsAuthTicket.UserData.Split("|"c)
      objMyAppPrincipal = New CustomPrincipal(objGenericIdentity, strRoles)
      HttpContext.Current.User = objMyAppPrincipal

      Log.Info("Application AuthenticateRequest Method Complete.")

End Sub

这将使用您可以在 Web 应用程序中访问的正确用户和角色凭据将 cookie 放入浏览器会话中。

理想情况下,您的用户只会在应用程序中担任一个角色,因此我相信这就是您可以使用角色检查方法的原因。为您编写一个辅助方法来遍历应用程序中的角色列表并测试以查看它们的角色是很容易的。

于 2008-10-17T21:58:06.447 回答