Tengo una aplicación MVC y escribí un RoleProvider personalizado para ello, como se muestra:MVC encargo RoleProvider cómo conectarlo a HttpContext.Current.User.IsInRole ("myrole")
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using VectorCheck.Models;
namespace VectorCheck.Security
{
public class MyRoleProvider : RoleProvider
{
private VectorCheckRepository<User> _repository { get; set; }
public MyRoleProvider()
{
_repository = new VectorCheckRepository<User>();
}
public MyRoleProvider(VectorCheckRepository<User> repository)
{
_repository = repository;
}
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override string ApplicationName
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public override void CreateRole(string roleName)
{
throw new NotImplementedException();
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
throw new NotImplementedException();
}
public override string[] GetAllRoles()
{
throw new NotImplementedException();
}
public override string[] GetRolesForUser(string username)
{
var user = _repository.GetUser(username);
return new string[] { user.Role.Name };
}
public override string[] GetUsersInRole(string roleName)
{
throw new NotImplementedException();
}
public override bool IsUserInRole(string username, string roleName)
{
var user = _repository.GetUser(username);
return string.Compare(user.Role.Name, roleName, true) == 0;
}
public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override bool RoleExists(string roleName)
{
throw new NotImplementedException();
}
}
}
Esto funciona muy bien con restringir el acceso a controladores y acciones usando:
[Authorize(Roles = "Administrator")]
sobre el controlador o la acción.
también quieren tener acceso restringido a algunas cosas en la vista, aunque usando:
HttpContext.Current.User.IsInRole("Administrator")
Este método no es parte de mi RoleProvider, así que no está siendo anulado.
¿Alguien sabe cómo hacerlo para que este método también?
Mi proveedor de funciones no contiene el método IsInRole sin embargo. Está heredando de RoleProvider y tiene el método IsUserInRole. – AnonyMouse
El método IsInRole en HttpContext.Current.User está en un tipo que implementa IPrincipal. cuando tiene un RoleProvider registrado y una solicitud proviene de un usuario autenticado, el IPrincipal será una instancia de RolePrincipal. Puede ver en el método anterior que IsInRole en RolePrincipal llama al método GetRolesForUser de RoleProvider, de modo que es en el que necesita establecer un punto de interrupción para asegurarse de que se está llamando correctamente. –