- Active Directory Role Provider: http://slalomdev.blogspot.co.uk/2008/08/active-directory-role-provider.html
Creating a custom role provider is pretty easy, all you have to do is create a new class and inherit RoleProvider:
public class ActiveDirectoryRoleProvider : RoleProvider
{}
References:
- using System.Web.Security;
- using System.Web.Configuration;
- using System.Collections.Specialized;
- using System.DirectoryServices;
- using System.Globalization;
- using System.Security;
Here's the the full code (minus the unimplemented inherited methods):
public class ActiveDirectoryRoleProvider : RoleProvider
{
    private string ConnectionStringName { get; set; }
    private string ConnectionUsername { get; set; }
    private string ConnectionPassword { get; set; }
    private string AttributeMapUsername { get; set; }
    public override void Initialize(string name, NameValueCollection config)
    {
        ConnectionStringName = config["connectionStringName"];
        ConnectionUsername = config["connectionUsername"];
        ConnectionPassword = config["connectionPassword"];
        AttributeMapUsername = config["attributeMapUsername"];
        base.Initialize(name, config);
    }
    public override bool IsUserInRole(string username, string roleName)
    {
        string[] roles = GetRolesForUser(username);
        foreach (string role in roles)
        {
            if (role.Equals(roleName, StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
        }
        return false;
    }
    public override string[] GetRolesForUser(string username)
    {
        var allRoles = new List<string>();
        var root = new DirectoryEntry(WebConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString, ConnectionUsername, ConnectionPassword);
        var searcher = new DirectorySearcher(root, string.Format(CultureInfo.InvariantCulture, "(&(objectClass=user)({0}={1}))", AttributeMapUsername, username));
        searcher.PropertiesToLoad.Add("memberOf");
        SearchResult result = searcher.FindOne();
        if (result != null && !string.IsNullOrEmpty(result.Path))
        {
            DirectoryEntry user = result.GetDirectoryEntry();
            PropertyValueCollection groups = user.Properties["memberOf"];
            foreach (string path in groups)
            {
                string[] parts = path.Split(',');
                if (parts.Length > 0)
                {
                    foreach (string part in parts)
                    {
                        string[] p = part.Split('=');
                        if (p[0].Equals("cn", StringComparison.OrdinalIgnoreCase))
                        {
                            allRoles.Add(p[1]);
                        }
                    }
                }
            }
        }
        return allRoles.ToArray();
    }
}
Add the role provider to your Web.Config:<system.web> <roleManager enabled="true" defaultProvider="ADRoleProvider" cacheRolesInCookie="true" cookieName=".ASPXROLES" cookiePath="/" cookieTimeout="30" cookieRequireSSL="false" cookieSlidingExpiration="true" createPersistentCookie="false" cookieProtection="All"> <providers> <clear /> <add name="ActiveDirectoryRoleProvider" connectionStringName="ADConnectionString" connectionUsername="username" connectionPassword="password" attributeMapUsername="sAMAccountName" type="ActiveDirectoryRoleProvider" /> </providers> </roleManager> </system.web>You can then check the roles of your user in code like so:Roles.IsUserInRole("My Group")Or control access to entire directories via the Web.Config:<location path="RestrictedSubDirectory"> <system.web> <authorization> <allow roles="My Group"/> <deny users="*" /> </authorization> </system.web> </location>
Problem:
ActiveDirectoryRoleProvider does not implement inherited abstract member 'Systm.web.Security.RoleProvider.FindUsersInRole()
Solution:
- Run the application and stop debugging and
- Just set the cursor to "RoleProvider", in the line: public class ActiveDirectoryRoleProvider : RoleProvider and a icon will come with option "Implement Role Provider" or hit "Ctrl + . ", then Enter.
 
 
No comments:
Post a Comment