Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于用户改变视图模型_C#_Asp.net Core - Fatal编程技术网

C# 基于用户改变视图模型

C# 基于用户改变视图模型,c#,asp.net-core,C#,Asp.net Core,我在Asp Net Core中有一个API,我想根据正在调用的用户更改调用的响应 例如,我们有两个客户 超级客户机 公共客户 我有一个UserViewModel,其中包含来自用户的所有数据 像 用户视图模型 名字 地址 超秘方 如果客户机是超级客户机Desmanythings,我希望在不做任何更改的情况下传递UserViewModel 如果客户端是PublicClient,我想隐藏SuperSecretNoOneCanSee,最好不要重写UserViewModel(我想避免重复)如果我理解正

我在Asp Net Core中有一个API,我想根据正在调用的用户更改调用的响应

例如,我们有两个客户

超级客户机

公共客户

我有一个UserViewModel,其中包含来自用户的所有数据

用户视图模型

  • 名字
  • 地址
  • 超秘方
如果客户机是超级客户机Desmanythings,我希望在不做任何更改的情况下传递UserViewModel


如果客户端是PublicClient,我想隐藏SuperSecretNoOneCanSee,最好不要重写UserViewModel(我想避免重复)

如果我理解正确,您实际上是在谈论序列化。您有一个“视图模型”:

public class UserViewModel
{
    public string Name { get; set; }
    public string Address { get; set; }
    public string SuperSecretNoOneCanSee { get; set; }
}
在控制器中,根据调用的客户端设置值。对于PublicClient,您应该省略
SuperSecretNoOneCanSee
。如果为两个客户端定义了不同的作用域,则可以执行以下操作:

var isPublicClient = User.HasClaim("scope", "PublicClient");
if (isPublicClient)
    return new UserViewModel { Name = "my name", Address = "my address" };
else
    return new UserViewModel { Name = "my name", Address = "my address", SuperSecretNoOneCanSee = "secret" };
这可能会导致PublicClient出现以下字符串:

或:

这取决于json序列化程序设置


在第一种情况下,您可以看到该字段存在,但它从来没有值。在第二种情况下,您将看不到它的存在。但这真的没关系。归根结底,您不必从viewmodel中实际删除该字段。

使用布尔超级用户属性创建一个客户端类。默认为false。如果这是真的,就换一个。这正是我想要实现的想法。但我想做得更全球化一点,就像一个过滤器。我只是不知道现在到底是怎么做的。实际上,我有一个来自EntityFramework的模型。使用Automapper将其映射到控制器中的
UserViewModel
。我在考虑根据用户声明进行条件映射,然后讨论授权。我建议您查看不同类型的授权,例如基于声明、基于资源和基于视图的授权。我建议你读一下这里的文件来获得一些想法:我已经读了很多遍了。我想要的是:每个请求都通过一个中间件。如果客户机具有正确的作用域,那么它什么也不做。否则,他没有授权的所有财产都将无效。可能吗?这些似乎未授权整个请求。您可以查询数据库(包括所有字段),并找到某种方法将授权字段仅映射到viewmodel。例如,您可以创建一个属性,用于定义授权级别(在ViewModel中的属性上)。通过反射,您可以根据属性中的授权级别映射字段。另一种更困难的方法是构建表达式,只选择根据属性允许的字段。
{ "Name": "my name", "Address": "my address", "SuperSecretNoOneCanSee": null }
{ "Name": "my name", "Address": "my address" }