我在Asp Net Core中有一个API,我想根据正在调用的用户更改呼叫的响应。
例如,我们有两个客户
SuperClientDoesManyThings
PublicClient
我有一个UserViewModel,其中包含用户的所有数据。
像
UserViewModel
如果客户端是SuperClientDoesManyThings,我想传递UserViewModel而不做任何更改。
如果客户端是PublicClient,我想隐藏SuperSecretNoOneCanSee,最好不要重写UserViewModel(我想避免重复)
答案 0 :(得分:1)
如果我理解正确,你实际上是在谈论序列化。你有一个' ViewModel':
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 的以下字符串:
{ "Name": "my name", "Address": "my address", "SuperSecretNoOneCanSee": null }
或者:
{ "Name": "my name", "Address": "my address" }
这取决于json序列化器设置。
在第一种情况下,您可以看到该字段存在,但它永远不会有值。在第二种情况下,你不会看到它存在。但这并不重要。最重要的是,您不必从视图模型中实际删除该字段。