由于缺少授权而抛出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=...");
答案 0 :(得分: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;
}
});