基于权限的 WebApi 端点的上下文序列化

2023-11-25

我正在使用 Asp.Net Web Api。我希望能够根据连接的客户端访问权限过滤掉响应对象上的某些字段。

Example:

class Foo
{
    [AccessFilter("Uberlord")]
    string Wibble { get; set; }

    string Wobble { get; set; }
}

返回数据时该字段Wibble仅当当前用户上下文可以满足“Uberlord”的值时才应返回。

我正在探索三种途径,但还没有找到可行的解决方案:

  1. 自定义 WebApi MediaTypeFormatter。
  2. 自定义 json.net IContractResolver。
  3. 用于操作响应对象的控制器的某种 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(使用前将#替换为@)

基于权限的 WebApi 端点的上下文序列化 的相关文章

随机推荐

  • 可变参数模板递归返回类型推导编译错误

    为什么下面的代码不能编译 template
  • 为什么 fclose 会挂起/死锁? (视窗)

    我有一个目录更改监视器进程 它从一组目录中的文件读取更新 我有另一个进程 可以对这些目录中的大量文件执行少量写入 测试程序 想象一下大约 100 个目录 每个目录有 10 个文件 每秒修改大约 500 个文件 运行一段时间后 目录监视器进程
  • “错误:‘myfn’声明为返回函数的函数”是什么意思?

    我正在尝试编写一个返回函数指针的函数 这是我的最小示例 void myfn int Doesn t work supposed to be a function called myfn that returns a pointer to a
  • 使用 THREE.Frustum 计算近/远平面顶点

    我需要一些帮助来处理 THREE Frustum 对象 我的问题 我需要计算近 远平面顶点 我已经看过这些教程 http www lighthouse3d com tutorials view frustum culling view fr
  • 使用php在谷歌云存储桶中创建文件夹

    我对谷歌云存储非常陌生 我想使用 php 编码在存储桶中创建文件夹 我搜索了很多网站 在 1 上我看到它是这样写的 在存储桶内创建文件夹将创建一个以目录命名的占位符对象 没有数据内容和 mimetype application x dire
  • 如何在 Flutter WebView 中将数据发布到 URL

    我想将一些数据发布到 Flutter WebView 中的 URL 主体 那么 我该怎么做呢 webview flutter目前没有发送帖子请求的方法 不过 你可以试试我的flutter inappwebview插入 它支持POST请求 使
  • Vue.js - 在 v-for 中使用过滤器

    我有一个简单的 Vue 过滤器 它将数组的长度限制为 n 个元素 像这样使用它效果很好 array limitArray 2 现在我想在里面使用它v for循环 像这样 li li 但这会引发错误 如何在内部使用过滤器v for 编辑 可能
  • like 子句 JPQL 中的参数

    我正在尝试使用 like 子句编写 JPQL 查询 LIKE code 我想要 code 4 并找到 455 554 646 我无法通过 code value namedQuery setParameter this value 因为在另一
  • Android studio git 使用私钥

    A 有一个 git 仓库的地址 我还有一个 open ssh 格式的私钥 Android Studio中的git可以使用吗 我尝试搜索一些信息 但目前没有运气 感谢您提供任何有用的信息 Edit My steps 1 I put my pr
  • Bing图片搜索分页-无限滚动

    当你在Bing搜索引擎上搜索图片时 结果显示如下 http www bing com images search q stack overflow 请注意 您如何不断滚动并滚动 并且没有 正常 分页 我的问题是 他们是如何做到这一点的 我可
  • 核心转储文件名使用 core_pattern %e.%p.core 获取线程名称而不是可执行文件名称

    我最近开始使用 pthread setname np 在我的应用程序中设置一些线程名称 执行此操作后 如果指定线程之一内发生崩溃 则核心转储文件名将获取线程名称 而不是 core pattern e p core 的可执行文件名称 根据核心
  • localStorage - 清除()或removeItem()?

    我应该使用clear 抹去一切localStorage 或者我应该手动removeItem 我在该特定网站上设置的那些 很容易跟踪 我这么问是因为我不想最终消灭用户localStorage如果他们设置了其他值 我正在本地主机中测试这个并注意
  • 检测编码并将所有内容设为 UTF-8

    我从各种 RSS 源中读出大量文本并将它们插入到我的数据库中 当然 提要中使用了几种不同的字符编码 例如UTF 8 和 ISO 8859 1 不幸的是 文本编码有时会出现问题 例子 Fu ball 中的 在我的数据库中应如下所示 如果是 则
  • 将 fseek 与指向 stdin 的文件指针结合使用

    根据命令行参数 我设置一个文件指针指向指定文件或标准输入 用于管道传输 然后 我将此指针传递给许多不同的函数以从文件中读取 这是获取文件指针的函数 FILE getFile int argc char argv FILE myFile NU
  • 如何使用Chef设置环境变量?

    有一个与此类似的问题 但无法使其正常工作 我想简单地设置一个环境变量 然后使用它 execute start zookeeper do cwd opt zookeeper 3 4 5 bin command zkServer sh star
  • 如何在 Bootstrap Validation 中创建自定义验证

    我的目标是验证特定的文本字段 其中该字段依赖于其他元素的值 例如 我有一个选择字段和一个输入文本字段 仅当选择标签具有选定值时才需要输入文本 希望有人能帮忙 看一眼 http bootstrapvalidator com 在我们的项目中 我
  • ValueError:错误的项目数量超过 500,放置意味着 1,Python 和 Pandas

    我只从 xlsx 文件导入两列 我想计算一些东西 平均值 偏差 百分比变化 然后我想绘制所有这些 第一部分不会给我带来任何问题 但绘图却会给我带来任何问题 我的代码如下所示 import matplotlib pyplot as plt i
  • 使用连续变量的决策树[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我有一个关于使用连续变量的决策树的问题 我听说当输出变量是连续的并且输入变量是分类的时 分割标准是减少方差什么的 但我不知道如果输入变量是连续的它是如何工作的 输入变量 连续 输出变
  • 浮动小于 FLT_MIN。为什么是FLT_TRUE_MIN?

    在尝试了解浮点下溢情况下会发生什么时 我发现我可以使浮点数比 FLT MIN 小得多 我在 OS 10 9 上使用 xcode 5 1 语言方言是 gnu99 include
  • 基于权限的 WebApi 端点的上下文序列化

    我正在使用 Asp Net Web Api 我希望能够根据连接的客户端访问权限过滤掉响应对象上的某些字段 Example class Foo AccessFilter Uberlord string Wibble get set strin