Tengo un marco C # MVC al que se le pasan objetos mediante una interfaz de usuario angular. En el lado de C #, estoy tratando de verificar si el usuario puede crear el objeto verificando las propiedades del objeto pasadas. ¿Existe una forma más limpia de hacer esto, como no tener que llamar a la identidad cada vez? Ahora mismo tengo:

Objeto que valida el código de mi controlador C #:

[HttpGet]
public ActionResult<AppUser> UpdateUser([FromBody]AppUser au)
        var identity = (ClaimsIdentity)User.Identity;
        var auclaims = new ApplicationUser(identity);    
        if (!auclaims.CanModifyUser(au))
            return StatusCode(401, "invalid permissions");
        .....
        }
0
Rilcon42 25 sep. 2019 a las 18:08

1 respuesta

La mejor respuesta

Puedes crear una nueva clase:

public class CheckPermission : ActionFilterAttribute {

    public string ArgName { get; }

    public CheckPermission(string argName)
    {
        this.ArgName = argName;

    }

    public override void OnActionExecuting(ActionExecutingContext context) {

        var controller = context.Controller as Controller;

        var identity = (ClaimsIdentity)controller.User.Identity;

        var au = context.ActionArguments[ArgName] as AppUser;

        var auclaims = new ApplicationUser(identity);

        if (!auclaims.CanModifyUser(au)) 
            context.Result = controller.StatusCode(401, "You do not have permission to add a user to this company");

        base.OnActionExecuting(context);
    }
}

Luego pon este atributo en tu acción:

 [HttpGet]
 [CheckPermission("au")]
 public ActionResult<AppUser> UpdateUser([FromBody]AppUser au)
 {
        // focus on your business logic
 }

Puede reutilizar este atributo para cualquier acción para verificar el permiso del usuario.

Esto es para aplicar el concepto de AOP.

Consulte https://msdn.microsoft.com/en-us/magazine/ dn574804.aspx

0
包俊仁 26 sep. 2019 a las 02:32