使用WebAuthenticationConfiguration时启用401质询响应
本文关键字:响应 启用 WebAuthenticationConfiguration 使用 | 更新日期: 2023-09-27 18:25:49
我有一个非常简单的WCF4 Restful web服务,它使用WcfRestContrib来允许自定义基本身份验证。当客户端抢先提供用户名和密码时,它非常有效,但如果没有,它会返回400错误请求响应,而不是挑战客户端提供凭据(通过401响应)。
该服务使用声明性方法通过用Attributes装饰必要的类来实现WcfRestContrib。这是我的服务合同声明:
// Standard attributes here
[WebAuthenticationConfiguration(typeof(WebBasicAuthenticationHandler),
typeof(SecurityValidator),
false,
"SearchService")
]
public class SearchService
它只有一个非常简单的操作:
// Standard attributes here
[OperationAuthentication]
SearchResponse Fetch(SearchRequest request)
我的UserNamePasswordValidator
看起来像(尽管这可能无关紧要,因为它只有在凭证通过时才会被调用):
public override void Validate(string userName, string password)
{
// TODO: Insert login validation logic here.
// To indicate login failure, throw a FaultException
// throw new FaultException("Unknown Username or Incorrect Password");
// Just return to indicate that the username and password are valid
return;
}
我尝试调试WcfRestContrib,发现WebBasicAuthenticationHandler
类正在抛出一个BasicAuthorizationException
(它只在框架代码中捕获),然而,由于某种原因,它没有将异常转换为401。
根据我在WcfRestContrib github网站上读到的内容,该网站的作者(Mike O'Brian)发布了一个问题,他说他希望看到它返回任何,而不是我读到的401,因为它目前返回401挑战。
如果有这个功能,那么我缺少什么,或者我做错了什么?
更新
如果使用WcfRestContrib无法做到这一点,是否有其他方法可以实现这一点(除了在IIS中使用标准的基于Windows的基本身份验证之外)?我对任何(其他)替代方案持开放态度。
我想明白了。我需要用ErrorHandlerAttribute
:装饰我的服务合同
// Standard attributes here
[WebAuthenticationConfiguration(typeof(WebBasicAuthenticationHandler),
typeof(SecurityValidator),
false,
"SearchService"),
ErrorHandler(typeof(WebErrorHandler))]
public class SearchService
只要将[ErrorHandler(typeof(WebErrorHandler))]
属性添加到服务中,所有的魔术都会发生。我知道这必须是一件简单的事情,我只希望在把额头放在桌子上之前能看到它。