使用 OWIN 添加多个 WWW-Authenticate 标头

Posted

技术标签:

【中文标题】使用 OWIN 添加多个 WWW-Authenticate 标头【英文标题】:Add Multiple WWW-Authenticate headers with OWIN 【发布时间】:2014-04-10 18:56:52 【问题描述】:

我希望我们的服务宣传不止一种身份验证方案:例如 Bearer 和一些自定义方案,比如 X-Custom。 (每个方案我都有一个 OWIN 中间件组件)。我认为RFC 2616, sec 14.47 的方法不止一种:

选项 a) 多个标题 WWW-Authenticate: Bearer WWW-Authenticate: X-Custom

选项 b) 逗号分隔列表 WWW-Authenticate: Bearer, X-Custom

我的偏好是选项 a),因此客户端只需执行 Response.Headers.Exists("WWW-Authenticate", preferredScheme) 之类的操作,而不是用逗号解析标头(RFC 说他们应该这样做,但是...)

但是,Katana 使用字典作为标题。尝试添加第二个标头会引发异常,并显示“字典中已存在密钥‘WWW-Authenticate’。”

中间件组件有没有办法注入多个 WWW-Authenticate 标头?

【问题讨论】:

【参考方案1】:

它是IDictionary<string, string[]>。键是一个字符串,但值是一个字符串数组。所以,你只需要像这样设置标题。

app.Run(async (IOwinContext context) =>

    context.Response.Headers.Add("WWW-Authenticate",
                                    new[]  "Bearer", "X-Custom" );
    // Some other code
);

更新 我相信您很乐意接受我的回答作为答案:)。谢谢,但不确定它回答了您的问题并因此进行了编辑。首先,我没有明白您试图提出的观点,即添加来自不同中间件的不同标头,但又希望在响应中的不同行中看到它们。我不认为对于像 WWW-Authenticate 这样的标准 HTTP 标头可以这样做。其实在回答你的问题之前,我很快就写了一个小程序来验证,但我犯的错误是这个标题拼错了。 因此,我实际上得到了这样的标题值。

WWW-Authentciate: X-Custom
WWW-Authentciate: Bearer

无论如何,以下方法可以在两行中获取标题值。

app.Use(async (IOwinContext context, Func<Task> next) =>

    context.Response.Headers.Set("WWW-Authenticate", "Bearer");

    await next.Invoke();
);

app.Run(async (IOwinContext context) =>

    var x = context.Response.Headers.Get("WWW-Authenticate");
    context.Response.Headers.Remove("WWW-Authenticate");
    context.Response.Headers.Add("WWW-Authenticate", new[]  "X-Custom", x );
);

但是,这不适用于标准标题。尽管如此,这是一个有趣的练习,但归根结底,这里的 API 没有公认的标准(据我所知)。即使您以某种方式使其以您想要的方式工作,当您更改底层 OWIN 组件(例如服务器或主机)时,您可能会得到不同的行为。毕竟,选项 a 和选项 b 是完全相同的,如果您在某个库之上工作以读取标题,您应该不会看到任何区别,除非您做一些低级的事情。

【讨论】:

这会发出选项 b)。有没有办法发出选项 a) ? 我会接受这个答案 - 它暗示答案是“不,你不能有选项 a)”我正在使用 context.Response.Headers.AppendValues("WWW-Authenticate" , scheme) 在每个 auth.组件(当然也会发出一个逗号分隔的列表)。

以上是关于使用 OWIN 添加多个 WWW-Authenticate 标头的主要内容,如果未能解决你的问题,请参考以下文章

使用 OWIN 身份从多个 API 客户端注册 Web API 2 外部登录

在 OWIN 中将 CORS 添加到 UseFileServer

具有多个 OIDC 身份验证配置的 OWIN

1.6 OWIN集成

Owin 学习系列1. 第一个 Owin 程序

OWIN显示死亡的黄色屏幕