Friday, August 23, 2013

Override the User.IsInRole and [Authorize(Roles = "Admin")] for MVC4 application

Override the User.IsInRole and [Authorize(Roles = "Admin")] for MVC4
application

I have created a custom role provider for my MVC4 application where I have
been successfully able to override CreateRole, GetAllRoles and RoleExists
methods and link them to my existing database as follows:
namespace Project.Providers
{
public class MyProvider : System.Web.Security.SqlRoleProvider
{
private MyContext dbcontext = new
MyContext(System.Configuration.ConfigurationManager.ConnectionStrings["MyContext"].ConnectionString);
private Repository<User> userRepository;
private Repository<Role> roleRepository;
public MyProvider()
{
this.userRepository = new Repository<MetaLearningUser>(dbcontext);
this.roleRepository = new Repository<Role>(dbcontext);
}
public override string[] GetAllRoles()
{
IEnumerable<Role> dbRoles = roleRepository.GetAll();
int dbRolesCount = roleRepository.GetAll().Count();
string[] roles = new string[dbRolesCount];
int i = 0;
foreach(var role in dbRoles)
{
roles[i] = role.Name;
i++;
}
return roles;
}
public override bool RoleExists(string roleName)
{
string[] roles = { "Admin", "User", "BobsBusiness" };
if(roles.Contains(roleName))
return true;
else
return false;
}
public override void CreateRole(string roleName)
{
Role newRole = new Role();
newRole.Name = roleName;
roleRepository.Add(newRole);
roleRepository.SaveChanges();
}
public override bool IsUserInRole(string userName, string roleName)
{
MetaLearningUser user = userRepository.Get(u => u.Username ==
userName).FirstOrDefault();
Role role = roleRepository.Get(r => r.Name ==
roleName).FirstOrDefault();
if (user.RoleID == role.RoleID)
return true;
else
return false;
}
}
}
I tried to override the AddUserToRole method but it doesnt seem to be
available only the:
AddUsersToRoles(string[] usernames, string[] roleNames) .
Will I need to create a similar custom class for the ability to be able to
override:
AddUserToRole(string username, string roleName).
Similarly I have been able to override the IsUserInRole(string userName,
string roleName) but have been unable to find a way to override the
User.IsInRole(string roleName)
What else must I do so that When I use:
[Authorize(Roles = "Admin")]
It will be based on the role provider that I have set up and not the asp
default

No comments:

Post a Comment