2013-05-05 91 views
3

由于缺少授权引发401错误时,我想包含www-authenticate头。servicestack:将www-authenticate头添加到错误响应

但我该怎么做?

我尝试了一个响应过滤器,但似乎没有工作。

编辑

当httperror抛出我的响应滤波器不被调用:

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

异常处理程序被调用,但所添加的报头是不响应的一部分(根据两个铬开发工具和Postman

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

你能提供什么也没有在响应滤波器的工作多一点背景?添加AuthFeature插件并创建全局响应筛选器以添加标题记录后,我将无效凭据张贴到'/ auth/credentials'。我收到了401,我的过滤器添加了标题。 – paaschpa 2013-05-06 18:25:09

+0

我没有使用AuthFeature - 这里可能会有一些差异。我的响应过滤器根本没有运行。我会再试一次,看看我是否可以发布一些代码,如果它不工作。 – Vegar 2013-05-07 08:10:19

回答

1

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

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