我正在使用 Asp.Net Web Api。我希望能够根据连接的客户端访问权限过滤掉响应对象上的某些字段。
Example:
class Foo
{
[AccessFilter("Uberlord")]
string Wibble { get; set; }
string Wobble { get; set; }
}
返回数据时该字段Wibble
仅当当前用户上下文可以满足“Uberlord”的值时才应返回。
我正在探索三种途径,但还没有找到可行的解决方案:
- 自定义 WebApi MediaTypeFormatter。
- 自定义 json.net IContractResolver。
- 用于操作响应对象的控制器的某种 AOP 包装器
我的问题是:
- 自定义格式化程序感觉不是执行此操作的正确位置,但可能是唯一的选择。
- 自定义 json 序列化程序无法访问当前上下文,因此我必须解决这个问题。
- 使用前两个选项,您需要针对每种响应格式(json、xml、某些自定义格式等)进行特定实现。这意味着如果支持其他响应类型,则需要自定义格式化程序/序列化程序以防止敏感数据泄漏。
- AOP 控制器包装器需要大量反射。
另一个好处是使用相同的机制从入站请求对象的字段中删除值。
我错过了一个明显的钩子吗?这个问题已经通过其他方式解决了吗?
实际上比我最初想象的要简单得多。我没有意识到的是DelegatingHandler可用于操纵响应以及请求中的Web API 管道.
ASP.NET Web API 消息的生命周期
委托处理程序
委托处理程序是消息管道中的一个扩展点,允许您在将请求传递到管道的其余部分之前对其进行处理。返回的响应消息也必须通过委托处理程序,因此任何响应也可以在此扩展点上进行监视/过滤/更新。
如果需要,委托处理程序也可以绕过管道的其余部分并发送回 Http 响应本身。
Example
下面是 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;
});
}
}
有关如何实现委托处理程序并将其添加到管道的 Microsoft 文章。ASP.NET Web API 中的 HTTP 消息处理程序
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)