带有 JWT 和基本身份验证的 HttpListener:如何发送 WWW-Authenticate? (自托管)

2024-02-01

我有一个在 mono/.NET 上跨平台运行的自托管 REST 应用程序。一个问题是 HttpListener 管理并阻止 WWW-Authenticate 标头的手动设置。如果您将自己限制为内置的 Basic、NTLM 等身份验证,或者不需要身份验证,那么这很好,但如果您想接受任何其他类型的令牌,则这是一个问题。

我使用带有 REST 风格界面的 JWT 令牌,并使用 Basic[1] auth 进行初始身份验证。在应用程序的另一部分,我正在做类似的事情,但使用自定义令牌和/或基本身份验证作为 API 另一部分的后备。

问题:

如何让 HttpListener 发送“WWW-Authenticate: Basic”质询标头,同时允许非基本授权令牌通过?

我尝试在监听器中设置基本和匿名:

_listener.AuthenticationSchemes = 
    AuthenticationSchemes.Basic | AuthenticationSchemes.Anonymous;

这会导致在任何情况下都不会返回 WWW-Authenticate 标头。我相信这应该允许基本或未经身份验证的连接,并且当我将状态代码设置为 401 (HttpStatusCode.Unauthorized) 时,还应该设置 WWW-Authenticate 质询。但事实并非如此(无论是在 mono 还是 .NET 上)。

如果我只设置 AuthenticationSchemes.Basic,HttpListener 会拒绝所有没有 Basic 样式令牌的连接,这没有任何用处。

明显但蹩脚的解决方法:

目前,我只是违反了 HTTP 规范并在没有 WWW-Authenticate 标头的情况下返回 401。这可行,但会降低与第三方工具的兼容性。

我考虑过使用完全不同的 HttpListener 实现,尽管大多数似乎要么处于原型阶段,要么是它们自己的大型库的一部分。我曾考虑过编写自己的 HttpListener,但此时将整个应用程序移植到 Java 开始显得很有吸引力。我希望找到比完整平台移植或编写自己的库更少工作的建议。

Ideas?

[1] - 这里需要基本身份验证,以便向后兼容低级脚本和一些其他系统。请假设我了解安全隐患并且正在使用 SSL 等。


HttpListener 根本不适用于任何非内置的身份验证。微软的实现是very积极将身份验证限制为四种内置类型,仅此而已。对于基于令牌的身份验证或任何其他目的,您不能使用 System.Net.HttpListener。

我的项目现在正在使用tekhedd/Socket HttpListener https://gitlab.com/derbyinsight/SocketHttpListener (on NuGet https://www.nuget.org/packages/tekhedd.SocketHttpListener)(一个叉子媒体浏览器/SocketHttpListener https://github.com/MediaBrowser/SocketHttpListener,也推荐),它是 mono-project 的 HttpListener 的一个分支。这样做的额外好处是它不使用 .NET 内置 HTTP 支持,因此您的应用程序不需要管理员访问权限,但缺点(或者是吗?)您不再拥有内置但友好的功能使用框架的 HTTPS 支持是一件很痛苦的事情。 (我建议在任何情况下都使用 HTTPS 代理(apache 或类似的)。)

不确定我是否应该在这里接受我自己的答案,但老实说我还没有找到更好的答案。希望这对某人有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 JWT 和基本身份验证的 HttpListener:如何发送 WWW-Authenticate? (自托管) 的相关文章

  • ASP Core HttpClientFactory 模式使用客户端证书

    任何人都知道在使用时如何使用客户端证书HttpClientFactory 在我发现的所有示例中 您需要提供HttpMessageHandler in the HttpClient构造函数 使用时不可用HttpClientFactory se
  • 从 C 中的 char* 获取单个字符

    有没有办法在 C 中逐字符遍历或从 char 中提取单个字符 考虑以下代码 现在获得单个角色的最佳方式是什么 建议我一种不使用任何字符串函数的方法 char a STRING 其他方式 char i for i a i i i points
  • is_integral 与 is_integer:其中之一是多余的吗?

    是积分 http en cppreference com w cpp types is integral and 是整数 http en cppreference com w cpp types numeric limits is inte
  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map
  • 比较 LINQ to SQL 中的两个日期

    我有一个数据库 其中有一个名为会议的表 会议日期使用以下格式存储在此表中 May 2nd 2011 例如 格式为5 2 2011 我的要求是获取两个日期 例如 2011 年 4 月 25 日和 2011 年 5 月 2 日 之间的会议 并编
  • & 运算符的含义是什么?

    在下面的代码中 Expression
  • 在目标 VS 安装时,VSIX 扩展内部使用的 WPF-Log4Net 未输出日志

    当 Log4net 在 VSIX 扩展中使用并安装在另一个目标 VS 上时 它不会记录日志 我有一个 WPF 解决方案 我下载了 log4net dll 添加了 log4net config 并将 复制到输出目录 值设置为 始终复制 log
  • boost::asio::io_service 是否保留处理程序的顺序?

    Does boost asio io service http www boost org doc libs release doc html boost asio reference io service html保证处理程序的调用顺序与
  • 我要恢复我的记忆!我怎样才能真正处理一个控件?

    我正在制作一个应用程序 它创建大量的窗口控件 按钮和标签等 它们都是通过函数动态生成的 我遇到的问题是 当我删除控件并处置它们时 它们不会从内存中删除 void loadALoadOfStuff while tabControlToClea
  • 为什么我不能从对中返回 unique_ptr?

    为什么我不能从对中返回 unique ptr include
  • 多维数组和指向指针的指针

    创建多维数组时char a 10 10 根据我的书 它说你必须使用类似于char a 10 将数组传递给函数 为什么必须这样指定长度 您不是只是将双指针传递给 with 并且该双指针不是已经指向分配的内存吗 那么为什么参数不能是char a
  • 以编程方式运行 T4 文本模板

    有没有一种方法可以通过代码以编程方式运行 T4 文本模板 我正在制作一种自定义域特定语言 我希望相关的文本模板在用户每次保存时运行 目前 这就是我在 DSL 模型中所做的事情 protected override void OnDocume
  • 如何删除实体框架6中的多对多关系

    如果将项目连接为多对多关系 则从数据库中删除项目时会出现问题 我的数据库看起来像 Project lt JobInProject gt Job ProjectID JobInProjectID JobID ProjectID JobID 主
  • 如何在Azure功能中添加razor视图文件?

    我正在创建一个应用程序 它是 azure 函数项目 我想在该项目中使用 Razor 视图 我应该在 azure 函数中使用任何模板引擎吗 得益于一些方面的进步剃刀之光项目 https github com toddams RazorLigh
  • 如何使用 ProtoGen 从 proto 文件生成结构

    我们一直在使用 protobuf net ProtoGen 从 proto 文件生成 C cs 文件 我们希望代替类来生成结构 例如 DataContract public struct Entity1 ProtoMember 1 publ
  • 为什么我无法调试动态加载的程序集?

    我正在开发一个 Web API 项目 该项目使用内部模拟框架 允许拦截和修改来自控制器的响应 它使用 MEF 加载包含某些先决条件匹配时执行的代码的程序集 我知道这是正常工作的 因为我可以在响应中看到模拟已被执行 但由于某种原因我无法调试动
  • Request.Form 和 Request.QueryString 之间的区别?

    有人可以告诉我两者之间的确切区别吗Request Form and Request QueryString 我知道一个区别 比如 如果HTTP请求方式为POST 则用户提交的数据在申请表 收藏 如果HTTP请求方法是GET 则用户提交的数据
  • 为什么必须通过 this 指针访问模板基类成员?

    如果下面的类不是模板 我可以简单地拥有x in the derived班级 但是 通过下面的代码 我have to use this gt x Why template
  • 如何组合||条件语句中的运算符[重复]

    这个问题在这里已经有答案了 代替 if foo 1 foo 5 foo 9 我喜欢将它们组合起来 类似于以下内容 这不起作用 if foo 1 5 9 那可能吗 不幸的是不是 你最好的选择是创建一个扩展方法 public static bo
  • DataGridView 捕获用户行选择

    我在处理选择时遇到问题DataGridView 我的网格视图包含一个金额列 表单上有一个文本框 应显示所选网格视图行的总数 因此 我需要在用户选择 取消选择 gridview 行时捕获事件并相应地计算 添加 减去 金额 我找到了两种方法 使

随机推荐

  • 如何在matplotlib中的不同图形中使用不同颜色图显示图像?

    我想在不同的图形中使用不同的颜色贴图显示图像 以下代码使用两个不同的窗口但具有相同的颜色图显示图像 import scipy misc from pylab import a scipy misc imread lena jpg figur
  • Objective-c 上的大整数

    任何人都可以提供代码BigInteger http docs oracle com javase 8 docs api java math BigInteger htmlObjective C 中提供 PowMod 函数的实现 我希望现在回
  • 如何在 Ruby 中实现 Pubnub 存在功能

    我想知道如何在 Rails 应用程序中使用 PubNub 实现用户存在 但我没有找到有关如何在服务器端和客户端实现此功能的完整指南 使用 Ruby 和 JavaScript 实现 PubNub 存在 按照这个连接两个 PubNub SDK
  • CGContextSetBaseCTM 无效上下文 0x0

    我目前正在开发一个 Java 应用程序 由于我没有OSX我已经从该应用程序所在的论坛 社区中寻求了一些人的帮助 但是在启动应用程序时会出现此错误OSX Oct 5 15 26 58 macbook pro local java 2384
  • JSTL .tld 文件在哪里?

    我已经下载了jstl 1 1 2 jar http repo1 maven org maven2 jstl jstl 1 1 2 jstl 1 1 2 jar来自 Maven 存储库 我希望 jar 包含标签的 tld 文件 但事实并非如此
  • 对facet_grid 图的所有方面强制启用X 轴文本

    我有同样的问题该用户 https stackoverflow com questions 10913840 force x axis on both graphs in a facet grid when x values are the
  • Cocoa - 从另一个可变参数方法调用可变参数方法(NSString stringWithFormat 调用)

    我有一个问题 NSString strigWithFormat format 因为它返回一个 id 并且我有很多代码将 NSString var 更改为其他个人类型 但编译器不会阻止我在某些地方将 NSString 设置为另一种类型的对象
  • 如何使用自定义编辑器属性从任何地方获取屏幕点击输入?

    TL DR 如何使用矢量实现 Unity 的 屏幕颜色 功能 好吧 对于我想要做的事情来说 标题非常简单 让用户单击一个按钮 然后单击屏幕上的一个位置 将该 世界 位置保存为矢量 这基本上是有效的 但它不会检测到检查器之外的左键单击 禁用统
  • fancybox2 / fancybox 导致页面跳转到顶部

    我已经在开发网站上实现了 fancybox2 当我使用 fancybox 单击链接等 时 整个 html 会移到它后面 并转到顶部 我让它在另一个演示中运行良好 但是当我将相同的代码拖到这个项目时 它会跳到顶部 不仅包含内联 div 的链接
  • 保留值直到 Teradata 中的值发生变化

    Teradata中有一个交易历史表 其中余额仅在有交易时才会更改 数据如下 Cust id Balance Txn dt 123 1000 27MAY2018 123 350 31MAY2018 例如 对于 5 月 27 日的客户 123
  • 使用 StrictMode 检测 Android 上被遗忘的 SQLite 事务?

    执行多个 SQL 语句而不将它们放入一个事务中是一个严重的瓶颈 参见例如http www sqlite org faq html q19 http www sqlite org faq html q19 我还没有彻底检查 SQLite 在
  • Tkinter GUI、I/O 和线程:何时使用队列、何时使用事件?

    我正在使用 TKinter 构建一个 GUI 用于与多通道分析仪的套接字连接 以定期 约 15 秒 接收和绘制数据 约 15 000 000 个值 在接收数据时 我不希望 GUI 冻结 因此我使用多线程进行连接处理 数据接收和绘图操作 正如
  • 使用 scala 使用用户名和密码进行 SSH

    有没有一种方法可以让我们在通过 scala 代码执行 ssh 时提供用户名和密码 这是我现在正在使用的代码 但我不知道如何在 HostConfig 中提供用户和密码 SSH 采用 HostConfigProvide https github
  • 使用命令行删除逗号之间的空格

    如果我有一个像这样的文件 1050505 Some Customer 1 1 Some Order 5 6 Item 1050505 Some Customer 1 1 Some Order 5 6 Item 1050505 Some Cu
  • 创建一个可以运行的DLL

    Windows 有一个名为 rundll32 exe 的实用程序 可以将本机动态链接库作为应用程序执行 假设我有一段代码可以打印 Hello World 到控制台 是否可以用 C 最好是 Visual C 编写一个可以使用 rundll32
  • IIS 7 启用的协议

    我有一台 win 2008r2 服务器 默认网站已启用协议设置为 http net tcp 当在默认网站下创建任何新应用程序时 我希望默认具有相同的启用协议 有人可以建议如何做到这一点吗 目前 当我添加应用程序时 会创建一个仅启用 http
  • 在 python 中使用 opencv 更改图像中某个区域的颜色

    我有一张图片 我想将所有白色像素更改为灰色 但仅限于图像的特定区域 示例图片 我只想更改红色矩形之外的图片 而不更改红色矩形内的图像 我已经有了通用代码 这是其他人的 Stackoverflow 问题的一部分 它改变每个白色像素的颜色 而不
  • 如何将 Span 添加到散景中的图例?

    因此 我创建了一个带有一些线条和一个跨度 或多个跨度 的图形 f figure f line x y1 legend label 1st set f line x y2 legend label 2st set vl Span locati
  • 如何将文本文件导入打字稿?

    作为一个最小的例子 我想将一个文本文件导入打字稿并将其打印到控制台而不使用读取它fs 像这样的东西 import text from foo txt console log text 我发现了很多解决方案的例子 例如this one htt
  • 带有 JWT 和基本身份验证的 HttpListener:如何发送 WWW-Authenticate? (自托管)

    我有一个在 mono NET 上跨平台运行的自托管 REST 应用程序 一个问题是 HttpListener 管理并阻止 WWW Authenticate 标头的手动设置 如果您将自己限制为内置的 Basic NTLM 等身份验证 或者不需