tek*_*edd 3 c# self-hosting httplistener basic-authentication jwt
我有一个在 mono/.NET 上跨平台运行的自托管 REST 应用程序。一个问题是 HttpListener 管理并阻止 WWW-Authenticate 标头的手动设置。如果您将自己限制为内置的 Basic、NTLM 等身份验证,或者不需要身份验证,那么这很好,但如果您想接受任何其他类型的令牌,则这是一个问题。
我使用带有 REST 风格界面的 JWT 令牌,并使用 Basic[1] auth 进行初始身份验证。在应用程序的另一部分,我正在做类似的事情,但使用自定义令牌和/或基本身份验证作为 API 另一部分的后备。
问题:
如何让 HttpListener 发送“WWW-Authenticate: Basic”质询标头,同时允许非基本授权令牌通过?
我尝试在监听器中设置基本和匿名:
_listener.AuthenticationSchemes =
AuthenticationSchemes.Basic | AuthenticationSchemes.Anonymous;
Run Code Online (Sandbox Code Playgroud)
这会导致在任何情况下都不会返回 WWW-Authenticate 标头。我相信这应该允许基本或未经身份验证的连接,并且当我将状态代码设置为 401 (HttpStatusCode.Unauthorized) 时,还应该设置 WWW-Authenticate 质询。但事实并非如此(无论是在 mono 还是 .NET 上)。
如果我只设置 AuthenticationSchemes.Basic,HttpListener 会拒绝所有没有 Basic 样式令牌的连接,这没有任何用处。
明显但蹩脚的解决方法:
目前,我只是违反了 HTTP 规范并在没有 WWW-Authenticate 标头的情况下返回 401。这可行,但会降低与第三方工具的兼容性。
我考虑过使用完全不同的 HttpListener 实现,尽管大多数似乎要么处于原型阶段,要么是它们自己的大型库的一部分。我曾考虑过编写自己的 HttpListener,但此时将整个应用程序移植到 Java 开始显得很有吸引力。我希望找到比完整平台移植或编写自己的库更少工作的建议。
有想法吗?
[1] - 这里需要基本身份验证,以便向后兼容低级脚本和一些其他系统。请假设我了解安全隐患并且正在使用 SSL 等。
HttpListener 根本不适用于任何非内置的身份验证。Microsoft 的实现非常积极地将身份验证限制为四种内置类型,仅此而已。对于基于令牌的身份验证或任何其他目的,您不能使用 System.Net.HttpListener。
我的项目现在使用tekhedd/SocketHttpListener(在 NuGet 上)( MediaBrowser/SocketHttpListener的一个分支,也推荐),它是 mono-project 的 HttpListener 的一个分支。这样做的额外好处是它不使用 .NET 内置 HTTP 支持,因此您的应用程序不需要管理员访问权限,但缺点(或者是吗?)您不再拥有内置但友好的功能使用框架的 HTTPS 支持是一件很痛苦的事情。(我建议在任何情况下都使用 HTTPS 代理(apache 或类似的)。)
不确定我是否应该在这里接受我自己的答案,但老实说我还没有找到更好的答案。希望这对某人有帮助!
| 归档时间: |
|
| 查看次数: |
1726 次 |
| 最近记录: |