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

本文关键字:WWW-Authenticate 何发送 JWT 验证 HttpListener 具有 | 更新日期: 2023-09-27 18:18:56

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

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

问题:

我如何让HttpListener发送"WWW-Authenticate: Basic"挑战头,同时也允许非基本授权令牌通过?

我已经尝试在侦听器中同时设置Basic和Anonymous:

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

这将导致在任何情况下都不返回WWW-Authenticate报头。我相信这应该允许基本或未经身份验证的连接,并且当我将状态码设置为401 (HttpStatusCode.Unauthorized)时,还应该设置WWW-Authenticate挑战。但是它不能(在mono或。net上)。

如果我只设置AuthenticationSchemes。基本的,HttpListener拒绝所有没有基本样式令牌的连接,这一点都没用。

明显但蹩脚的变通方法:

目前我只是违反HTTP规范和返回401没有WWW-Authenticate头。这可以工作,但会降低与第三方工具的兼容性。

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

想法?

[1] -这里需要基本授权来向后兼容低级脚本和其他一些系统。请假设我了解安全含义,并且正在使用SSL等。

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

HttpListener对任何非内置的验证都不起作用。微软的实现非常积极地将权限限制为四种内置类型,仅此而已。对于基于令牌的认证或任何其他目的,您不能使用System.Net.HttpListener。

我的项目现在使用tekhedd/SocketHttpListener(在NuGet上)(mediabbrowser/SocketHttpListener的一个分支,也推荐),这是单个项目的HttpListener的一个分支。这有一个额外的好处,它不使用。net内置的HTTP支持,所以你的应用程序不需要管理员访问,但缺点(或者是吗?),你不再有内置的,但有点痛苦的工作与框架的HTTPS支持。(我建议在任何情况下使用代理(apache或类似的)。)

我不确定我是否应该接受我自己的答案,但老实说,我还没有找到一个更好的答案。希望这对大家有所帮助!