我可以通过编程方式加载<asp:RoleGroup>的"角色"属性吗?

Pan*_*cus 4 asp.net security webforms roles

我正在维护一个ASP.NET应用程序,现在整个站点的各个地方都定义了安全性.在代码隐藏中有一些逻辑,比如if User.IsInRole(...),在ASPX页面中还有其他逻辑:

<asp:LoginView ID="lvDoSomeStuff" runat="server">
    <RoleGroups>
        <asp:RoleGroup Roles="Accounting,HR,Blah">
        ...
    </RoleGroups>
</asp:LoginView>
Run Code Online (Sandbox Code Playgroud)

当新功能请求进入并创建新角色时,我不得不浏览整个应用程序并确保我没有错过任何区域.我想在将来避免这种情况.

如何Roles<asp:RoleGroup>编程方式设置元素的属性?我尝试过这样的事情:

<asp:LoginView ID="lvDoSomeStuff" runat="server">
    <RoleGroups>
        <asp:RoleGroup Roles="<%= UserManager.GetRolesThatCanDoX() %>">
        ...
    </RoleGroups>
</asp:LoginView>
Run Code Online (Sandbox Code Playgroud)

where GetRolesThatCanDoX()返回以逗号分隔的角色名称列表,但我的方法似乎永远不会被调用.

是否有可能在ASP.NET WebForms中执行类似的操作?请帮我解耦我的代码!;-)

解决方案: Phantomtypist的答案非常有效.我的实施如下:

ASPX:

<asp:LoginView ID="lvDoSomeStuff" runat="server">
    <RoleGroups>
        <asp:RoleGroup>
        ...
        </asp:RoleGroup>
    </RoleGroups>
</asp:LoginView>
Run Code Online (Sandbox Code Playgroud)

代码隐藏:

protected void Page_Load(object sender, EventArgs e)
{
    // Load rolegroups from UserManager
    lvDoSomeStuff.RoleGroups[0].Roles = UserManager.GetRolesThatCanDoStuff().ToArray();
    lvDoSomeOtherStuff.RoleGroups[0].Roles = UserManager.GetRolesThatCanDoOtherStuff().ToArray();
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*ris 6

你尝试过这样的事吗......

码:

protected void Page_Load(Object sender, EventArgs e)
{
    RoleGroup rg = new RoleGroup();
    rg.ContentTemplate = new CustomTemplate();
    String[] RoleList = {"users"};
    rg.Roles = RoleList;
    RoleGroupCollection rgc = LoginView1.RoleGroups;
    rgc.Add(rg);

}
Run Code Online (Sandbox Code Playgroud)

设计师:

<asp:LoginView id="LoginView1" runat="server">
     <AnonymousTemplate>
         You are not logged in.<br />
         <asp:LoginStatus id="LoginStatus1" runat="server"></asp:LoginStatus>
     </AnonymousTemplate>
     <LoggedInTemplate>
          You are logged in as
          <asp:LoginName id="LoginName1" runat="server" />. This message is not from the template.<br />
          <asp:LoginStatus id="Loginstatus2" runat="server"></asp:LoginStatus>
     </LoggedInTemplate>
</asp:LoginView>
Run Code Online (Sandbox Code Playgroud)