使用WebAuthenticationConfiguration时启用401 Challenge响应

时间:2012-02-24 00:21:25

标签: c# .net wcf rest wcf-rest-contrib

我有一个非常简单的WCF4 Restful Web服务,它使用WcfRestContrib来允许自定义基本身份验证。当客户端抢先提供用户名和密码时,它会很有效,但如果不这样做,则会返回400 Bad Request响应,而不是挑战客户端提供凭据(通过401响应)。

该服务使用声明方法通过使用Attributes修饰必要的类来实现WcfRestContrib。这是我的ServiceContract声明:

// 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 site上所读到的内容,有an issue posted by its author (Mike O'Brian)说他希望看到它返回而不是 401我读过的任何内容因为它目前返回401挑战。

如果有这个功能,那我错过了什么,或者我做错了什么?

更新

如果没有办法用WcfRestContrib执行此操作,是否有另一种方法可以实现此目的(除了在IIS中使用标准的基于Windows的基本身份验证)?我对任何(其他)替代解决方案持开放态度。

1 个答案:

答案 0 :(得分:1)

我明白了。我需要使用ErrorHandlerAttribute

来装饰我的ServiceContract
// Standard attributes here
[WebAuthenticationConfiguration(typeof(WebBasicAuthenticationHandler),
                            typeof(SecurityValidator),
                            false,
                            "SearchService"),
 ErrorHandler(typeof(WebErrorHandler))]
public class SearchService

只需将[ErrorHandler(typeof(WebErrorHandler))]属性添加到服务即可实现所有神奇功能。我知道它必须是简单的,只是希望我能在看到我的桌子上的前额之前看到它。