3

由于缺少授权而引发 401 错误时,我想包含 www-authenticate 标头。

但是我该怎么做呢?

我尝试使用响应过滤器,但这似乎不起作用。

编辑

抛出 httperror 时不会调用我的响应过滤器:

appHost.ResponseFilters.Add((req, res, obj) => res.AddHeader(HttpHeaders.WwwAuthenticate, "Basic realm=..."));

调用了异常处理程序,但添加的标头不是响应的一部分(根据 Chrome 开发工具和Postman

appHost.ExceptionHandler += (req, res, name, exception) => res.AddHeader(HttpHeaders.WwwAuthenticate, "Basic realm=...");
4

1 回答 1

1

我找不到任何可以添加到响应标头的钩子:

  • ResponseFilters抛出异常后不调用。
  • ServiceExceptionHandler不提供响应对象。
  • ExceptionHandler在发送响应后调用,所以为时已晚。

由于我在请求过滤器中检查凭据,因此我可以访问那里的响应对象。我最终得到了一个自定义异常LogonException,我可以捕获并添加标题:

appHost.RequestFilters.Add(
    (req, res, obj) => 
    {
        var creds = request.GetBasicAuthUserAndPassword();

        try
        {
            myService.logon(creds);
        }
        catch(LogonException)
        {
            res.AddHeader(HttpHeaders.WwwAuthenticate, "Basic realm=...");
            trow;
        }
    });
于 2013-05-15T11:44:11.157 回答