http - 使用 OWIN 添加多个 WWW-Authenticate header

标签 http authentication asp.net-web-api restful-authentication katana

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

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

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

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

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

是否有一种方法可以让中间件组件注入(inject)多个 WWW-Authenticate header ?

最佳答案

IDictionary<string, string[]> 。键是一个字符串,但值是一个字符串数组。因此,您只需像这样设置标题即可。

app.Run(async (IOwinContext context) =>
{
    context.Response.Headers.Add("WWW-Authenticate",
                                    new[] { "Bearer", "X-Custom" });
    // Some other code
});

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

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 });
});

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

关于http - 使用 OWIN 添加多个 WWW-Authenticate header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22253295/

相关文章:

ruby - Rack::Auth 是否与基本 HTTP 身份验证相同?

jquery - ASP MVC 3 - Jquery Ajax 总是发送选项而不是 Post

javascript - 为什么叫长轮询

jquery - 自定义摘要身份验证

http - 用于标识资源的查询字符串

authentication - Firebase 身份验证导致错误代码 "auth/network-request-failed"

asp.net - 从表单例份验证转换为 Windows 身份验证

javascript - 将文件对象从 Javascript 传递到 Web API

c# - 来自 WebAPI 的服务器调用图像

asp.net - 标准形式的 API Token 应该放在哪里? header 还是 URI?