带有JWT和基本身份验证的HttpListener:如何发送WWW身份验证? (自托管)
作者:互联网
我有一个在Mono / .NET上跨平台运行的自托管REST应用程序.一个问题是HttpListener管理和阻止WWW-Authenticate标头的手动设置.如果您将自己限制为内置的Basic,NTLM等身份验证,或者不需要身份验证,那很好,但是如果您要接受任何其他类型的令牌,则是一个问题.
我将JWT令牌与REST风格的接口配合使用,并使用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会拒绝没有基本样式令牌的所有连接,而这并不是远程使用的.
明显但la脚的解决方法:
目前,我只是违反了HTTP规范,没有WWW-Authenticate标头就返回401.这可行,但是降低了与第三方工具的兼容性.
我考虑过使用完全不同的HttpListener实现,尽管大多数似乎都处于原型阶段或属于自己的大型库的一部分.我已经考虑过编写自己的HttpListener,但是从那时起,将整个应用程序移植到Java看起来就很有吸引力.我想找到比完整的平台端口或编写我自己的库要少的建议.
有想法吗?
[1]-此处需要基本身份验证,以便与低级脚本和某些其他系统向后兼容.请假设我了解安全隐患,并且正在使用SSL等.
解决方法:
HttpListener根本无法用于任何非内置身份验证.微软的实现非常积极地将身份验证限制为四种内置类型,仅此而已.出于基于令牌的身份验证或任何其他目的,您不能使用System.Net.HttpListener.
我的项目现在使用的是github的MediaBrowser/SocketHttpListener(为之分叉),它是一个单项目的HttpListener的分叉.这样做还有一个好处,就是它不使用.NET内置的HTTP支持,因此您的应用程序不需要管理员访问权限,但是缺点是(或者是?)您不再拥有内置的,但种类丰富的-框架的HTTPS支持使工作变得痛苦. (无论如何,我建议在HTTPS中使用代理(apache或类似的代理).)
不知道我是否应该在这里接受自己的答案,但是老实说,我还没有找到更好的答案.希望这对某人有帮助!
标签:httplistener,self-hosting,jwt,basic-authentication,c 来源: https://codeday.me/bug/20191027/1946962.html