Asp.net web api ASP.NET WEB API 2:角色或声明相关的模型验证

Asp.net web api ASP.NET WEB API 2:角色或声明相关的模型验证,asp.net-web-api,model-validation,Asp.net Web Api,Model Validation,我有一个独特的要求,我不知道如何处理。我们正在使用一个底层存储库,它允许在参数方面有相当大的灵活性。控制器服务作为“服务”对象注入控制器类的“服务”属性中,并封装对实体框架的调用。 例如 这部分由Autofac处理,一切都很好 接下来,我们在控制器中使用标准的GET、POST、PUT、DELETE和PATCH方法,这些方法接受单个用户模型。换句话说,只有一个用户模型被使用过,这就是问题所在 虽然底层服务类只处理来回的数据传递,但它将验证的粒度控制需求推到了管道上。这对我来说并不反常 考虑到我们只

我有一个独特的要求,我不知道如何处理。我们正在使用一个底层存储库,它允许在参数方面有相当大的灵活性。控制器服务作为“服务”对象注入控制器类的“服务”属性中,并封装对实体框架的调用。 例如

这部分由Autofac处理,一切都很好

接下来,我们在控制器中使用标准的GET、POST、PUT、DELETE和PATCH方法,这些方法接受单个用户模型。换句话说,只有一个用户模型被使用过,这就是问题所在

虽然底层服务类只处理来回的数据传递,但它将验证的粒度控制需求推到了管道上。这对我来说并不反常

考虑到我们只有一个API使用具有验证属性的模型,我们遇到了一个问题,即调用API的不同应用程序需要不同类型的验证。模型结构良好。只是一些属性,取决于“您是谁”和发送的HTTPMethod,不是验证的

例:

让我们看两个场景: 1.基本用户 2.系统用户

作为一个基本用户,UserID是必需的:GET、PUT、PATCH(技术上也需要删除,但不使用)。POST不需要它,因为这将创建他们自己的用户

作为系统用户,UserID在GET中不是必需的,但在PUT、PATCH、DELETE中是必需的

因此,我很难弄明白如何做到这一点,而不需要为基本用户和系统用户分别创建一个api和一个api

我想在管道中保持这一高度,所以我没有在控制器api方法中这样做,即检查角色/声明、创建/转换/或以其他方式将绑定模型映射到每个角色/声明的特定具体模型,然后运行验证,然后返回模型绑定错误(如果有)。这个方法有很多问题,我更希望它是在方法或api控制器的属性上


是否有任何方法可以基于“您是谁”进行一种类型的模型绑定和/或模型验证?这可能是角色或声明造成的

您今天的验证是如何处理的?如果您使用数据验证属性和内置的.NET机制来验证模型,那么,您是否考虑过构建一个验证层,该层使用相同的功能,但也允许基于请求方法和用户进行验证?最初的目的是使用数据注释,我认为我们仍然会沿着这条道路前进,因为这是一个很好的fwk,可以帮助验证。我已经考虑过这种情况,我的最新想法要求我能够在绑定期间/之后更改模型类型。我认为,这将需要模型、转换或类型转换器的接口。想法?如果您的验证仅依赖于数据注释,那么您可以在定义中或通过使用接收通用对象的验证管理器为您的模型实现IValidatableObject。然而,与我目前的情况一样,我必须通过在一些验证例程中调用数据库来检查数据的一致性。如果您现在或将来需要这样做,那么在将数据传递给服务之前或从服务中显式调用验证器将更好地为您服务;有点像buddy类的概念,但是一个类定义模型,多个类定义验证模板。我的理想是能够在管道中运行验证,但要预先确定使用哪个“buddy”类进行验证。我不知道这是否能做到,但听起来似乎有道理。
public UserController:ApiController{

  public IUserSvc Service {get;set}

  public UserController(IUserSvc service){
   this.Service=service;
  }

}
public class User{

 public int UserID {get;set}

 public string Name {get;set;}

}