WindowsPrincipal.IsInRole actually check roles and NOT groups?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Andy

    WindowsPrincipal.IsInRole actually check roles and NOT groups?

    Hi,

    I currently have my application setup and built using Windows
    Authentication (WindowsPrincip al). For security checks, I simply do
    an IsInRole call on the Principal. The role permissions are hard-
    coded, something like this:

    private static string[] allowedReadRole s = new string[] { "Sales",
    "Ordering" };

    I now need to brand my application, and while the roles will remain
    the same, the problem is that IsInRole is functioning via group
    membership. The branding will be for other companies, which are owned
    by the same owners, and use the same office buildings, network /
    domain and computers are the main company (the other companies have
    less than 10 people).

    So, adding the users for Company B to existing groups isn't really an
    option... they'd have access to the application for Company A. In the
    database that would work, since I add logons for new groups and map
    them to existing database roles. For my code though, I don't see a
    way to do this. I could provide a similar mapping, but that would
    require me to update multiple databases to do the mappings each time I
    add a new role to the application.

    Any other ideas? Has anyone used Authentication Manager, which allows
    you to define real roles, not AD Groups? Is there anything that puts
    actual roles in WindowsPrincipa l.IsInRole, not just windows groups?
    It seems an odd thing; AD groups aren't roles, yet WindowsPrincipa l
    treats them as such.

    Thanks
    Andy
  • Marc Gravell

    #2
    Re: WindowsPrincipa l.IsInRole actually check roles and NOT groups?

    Well, if it helps, even with windows identity you can provide your own
    roles definitions. If you can look them up from somewhere,
    GenericPrincipa l may be of use - alternatively create your own
    IPrincipal that performs IsInRole... (perhaps prepending an NT name
    onto the role per instance?)

    But essentially you are going to have to store the data somewhere...

    Some ideas...

    Mac

    using System;
    using System.Security ;
    using System.Security .Permissions;
    using System.Security .Principal;
    using System.Threadin g;
    static class Program
    {
    static void Main()
    {
    string[] userRoles = { "Sales" };
    Thread.CurrentP rincipal = new
    GenericPrincipa l(WindowsIdenti ty.GetCurrent() , userRoles);
    TestSales();
    try
    {
    TestAdmin();
    }
    catch (SecurityExcept ion)
    {
    Console.WriteLi ne("Admin failed ;-p");
    }
    }
    [PrincipalPermis sion(SecurityAc tion.Demand, Role="Sales")]
    static void TestSales() { Console.WriteLi ne("Sales"); }
    [PrincipalPermis sion(SecurityAc tion.Demand, Role = "Admin")]
    static void TestAdmin() { Console.WriteLi ne("Admin"); }
    }
    // another idea for separating the data...
    class SuffixPrincipal : IPrincipal
    {
    private readonly IPrincipal parent;
    private readonly string roleSuffix;
    public SuffixPrincipal (IPrincipal parent, string roleSuffix)
    {
    if (parent == null) throw new ArgumentNullExc eption("parent" );
    this.parent = parent;
    this.roleSuffix = roleSuffix;
    }
    public IIdentity Identity { get { return parent.Identity ; } }
    public bool IsInRole(string role)
    {
    return parent.IsInRole (role + roleSuffix);
    }
    }

    Comment

    Working...