Utilizo una clase estática para la validación de roles y en el cshtml utilicé esta clase, la validación de roles está fuera de cshtml.
Tengo mis funciones autorizadas o contenido en la base de datos (por usuario o por función) por lo que no tiene que volver a implementar si la definición de acceso cambia.
public static class AuthorizeContent
{
public static bool AuthorizeAccessContent(string Content)
{
bool bReturn = false;
DBContext db = new DBContext();
string[] RolesUser = Roles.GetRolesForUser(WebSecurity.CurrentUserName);
foreach (AuthorizedContentRole aut in db.AuthorizedContentRole)
{
foreach (string rol in RolesUser)
{
if (aut.Role==rol && aut.Content==Content)
{
bReturn = true;
break;
}
}
}
foreach (AuthorizedContentUser aut in db.AuthorizedContentUser)
{
if (aut.UserName == WebSecurity.CurrentUserName && aut.Content == Content)
{
bReturn = true;
break;
}
}
return bReturn;
}
/// en el cshtml
@if (AuthorizeContent.AuthorizeAccessContent(Content))
{
<li class="two">
<h5>Administrator link</h5>
@Html.ActionLink("Admin secret info","Index", "Information")
</li>
}
también se podría utilizar como un filtro [AccionAuthorize (Acción = "Mi contenido")]
public class AccionAuthorizeAttribute : AuthorizeAttribute
{
public string Action { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
filterContext.Result = new HttpUnauthorizedResult();
else if (!AutorizacionContenido.AutorizaAccesoContenido(Action))
filterContext.Result = new HttpUnauthorizedResult();
base.OnAuthorization(filterContext);
}
}
Gracias! Aquí hay un giro: tengo mis enlaces de pestaña en la página maestra y quiero que aparezca una pestaña para ciertos roles. ¿Sabes cómo puedo agregar una referencia a mi maestro para el IPrincipal? – Ben
Usa 'HttpContext.Current.user' o' ViewContext.HttpContext.User' - eso debería ser el truco :-) – Charlino
Ahh, ahora puedo seguir con las cosas ... ¡Agradezco la ayuda! – Ben