Bro*_*ski 8 rest serialization data-security asp.net-web-api
我正在使用Asp.Net Web Api.我希望能够根据连接的客户端访问权限过滤掉响应对象上的某些字段.
例:
class Foo
{
[AccessFilter("Uberlord")]
string Wibble { get; set; }
string Wobble { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
返回数据时,Wibble只有当前用户上下文可以满足"Uberlord"的值时,才应返回该字段.
我正在探索三种途径,但我没有一个有效的解决方案:
我的问题是:
另一个好处是使用相同的机制从入站请求对象的字段中去除值.
我错过了一个明显的钩子吗?这是通过另一种方式解决的吗?
实际上比我最初想象的要简单得多。我没有意识到的是,可以用来操纵Web Api PipelineDelegatingHandler中的响应和请求。
委托处理程序
委托处理程序是消息管道中的一个扩展点,允许您在将请求传递到管道的其余部分之前对其进行处理。返回的响应消息也必须通过委托处理程序,因此任何响应也可以在此扩展点上进行监视/过滤/更新。
如果需要,委托处理程序也可以绕过管道的其余部分并发送回 Http 响应本身。
下面是 DelegatingHandler 的示例实现,它可以操作响应对象或完全替换它。
public class ResponseDataFilterHandler : DelegatingHandler
{
protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return base.SendAsync(request, cancellationToken)
.ContinueWith(task =>
{
var response = task.Result;
//Manipulate content here
var content = response.Content as ObjectContent;
if (content != null && content.Value != null)
{
((SomeObject)content.Value).SomeProperty = null;
}
//Or replace the content
response.Content = new ObjectContent(typeof(object), new object(), new JsonMediaTypeFormatter());
return response;
});
}
}
Run Code Online (Sandbox Code Playgroud)
有关如何实现委托处理程序并将其添加到管道的 Microsoft 文章。ASP.NET Web API 中的 HTTP 消息处理程序
| 归档时间: |
|
| 查看次数: |
1898 次 |
| 最近记录: |