web-dev-qa-db-fra.com

Version MVC5 Claims de l'attribut Authorize

J'essaie certaines nouveautés de la VS2013 RC avec MVC5 et le nouveau middleware d'authentification OWIN.

J'ai donc l'habitude d'utiliser l'attribut [Authorize] Pour limiter les actions par rôle, mais j'essaie d'utiliser une autorisation basée sur les revendications/activités, et je ne trouve pas d'attribut équivalent pour celui-ci.

Y a-t-il une évidence qui me manque ou dois-je rouler le mien? Je m'attendais à ce qu'il y en ait un en dehors de la boîte.

Ce que je recherche précisément, c’est quelque chose qui ressemble à [Authorize("ClaimType","ClaimValue")] je suppose.

Merci d'avance.

75
Stimul8d

J'ai fini par écrire un simple attribut pour le gérer. Je ne pouvais rien trouver dans le cadre dès la sortie de la boîte sans un tas de config supplémentaire. Énumérés ci-dessous.

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);
        }
    }
}

Bien sûr, vous pouvez supprimer les paramètres de type et de valeur si vous préférez utiliser le triplet controller-action-verbe pour les revendications.

66
Stimul8d
  1. Vous ne vérifierez pas les revendications spécifiquement, mais plutôt les paires action/ressource. Factorez les revendications/données réelles vérifiées dans un gestionnaire d'autorisation. Séparation des préoccupations.
  2. MVC et ClaimsPrincipalPermission ne font pas bon ménage. Il lève une exception SecurityException et ne facilite pas les tests unitaires.

Ma version est ici: http://leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/

30
leastprivilege

J'ai constaté que vous pouvez toujours utiliser l'attribut Autorisation avec les rôles et les utilisateurs, avec les revendications.
Pour que cela fonctionne, votre ClaimsIdentity doit inclure 2 types de revendications spécifiques:

    ClaimTypes.Name

et

    ClaimTypes.Role

Ensuite, dans votre classe dérivée de OAuthAuthorizationServerProvider, dans les méthodes GrantXX que vous utilisez, lorsque vous créez votre ClaimsIdentity, ajoutez ces 2 revendications.

Exemple:

    var oAuthIdentity = new ClaimsIdentity(new[]
    {
        new Claim(ClaimTypes.Name, context.ClientId),
        new Claim(ClaimTypes.Role, "Admin"),
    }, OAuthDefaults.AuthenticationType);

Ensuite, pour toute action, vous pouvez utiliser [Authorize(Roles ="Admin")] pour restreindre l'accès.

8
Softlion
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation="Delete", Resource="Customer")]
public ActionResult Delete(int id)
{
    _customer.Delete(id);
    return RedirectToAction("CustomerList");
}

ClaimsPrincipalPermissionAttribute Class

3
jd4u