asp.net mvc - route - MVC5 versión de reclamaciones del atributo Autorizar
tag helper asp net core 2 (4)
Estoy probando algunas de las cosas nuevas en VS2013 RC con MVC5 y el nuevo middleware de autenticación OWIN.
Por lo tanto, estoy acostumbrado a usar el atributo [Authorize]
para limitar las acciones por rol, pero estoy tratando de usar declaraciones / actividad basada en la autorización, y no puedo encontrar un atributo equivalente para él.
¿Hay uno obvio que me falta o tengo que hacer el mío? Esperaba que hubiera una fuera de la caja.
Lo que estoy buscando específicamente es algo parecido a [Authorize("ClaimType","ClaimValue")]
Supongo.
Gracias por adelantado.
- No verificará las reclamaciones específicamente, sino más bien los pares de acción / recurso. Factorizar las comprobaciones reales de reclamos / datos en un administrador de autorizaciones. Separación de intereses.
- MVC y ClaimsPrincipalPermission no son una buena combinación. Lanza una SecurityException y no es amigable para pruebas unitarias.
Mi versión está aquí: http://leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/
Descubrí que todavía puede usar el atributo Autorización con roles y usuarios, con reclamos.
Para que esto funcione, su ClaimsIdentity debe incluir 2 tipos de reclamos específicos:
ClaimTypes.Name
y
ClaimTypes.Role
Luego, en su clase derivada de OAuthAuthorizationServerProvider, en los métodos GrantXX que utiliza, cuando crea su ClaimsIdentity, agregue estas 2 afirmaciones.
Ejemplo:
var oAuthIdentity = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, context.ClientId),
new Claim(ClaimTypes.Role, "Admin"),
}, OAuthDefaults.AuthenticationType);
Luego, en cualquier acción, puede usar [Authorize(Roles ="Admin")]
para restringir el acceso.
Terminé simplemente escribiendo un atributo simple para manejarlo. No pude encontrar nada en el marco de la caja sin un montón de configuraciones adicionales. Listado a continuación.
public class ClaimsAuthorizeAttribute : AuthorizeAttribute
{
private string claimType;
private string claimValue;
public ClaimsAuthorizeAttribute(string type, string value)
{
this.claimType = type;
this.claimValue = value;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
var user = filterContext.HttpContext.User as ClaimsPrincipal;
if (user != null && user.HasClaim(claimType, claimValue))
{
base.OnAuthorization(filterContext);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
Por supuesto, podría eliminar los parámetros tipo y valor si estuviera contento de usar el triplete controlador-acción-verbo para las afirmaciones de alguna manera.
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation="Delete", Resource="Customer")]
public ActionResult Delete(int id)
{
_customer.Delete(id);
return RedirectToAction("CustomerList");
}