使用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的基本身份验证之外)?我对任何(其他)替代方案持开放态度。

使用WebAuthenticationConfiguration时启用401质询响应

我想明白了。我需要用ErrorHandlerAttribute:装饰我的服务合同

// Standard attributes here
[WebAuthenticationConfiguration(typeof(WebBasicAuthenticationHandler),
                            typeof(SecurityValidator),
                            false,
                            "SearchService"),
 ErrorHandler(typeof(WebErrorHandler))]
public class SearchService

只要将[ErrorHandler(typeof(WebErrorHandler))]属性添加到服务中,所有的魔术都会发生。我知道这必须是一件简单的事情,我只希望在把额头放在桌子上之前能看到它。