我有一个非常简单的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的基本身份验证)?我对任何(其他)替代解决方案持开放态度。
答案 0 :(得分:1)
我明白了。我需要使用ErrorHandlerAttribute
:
// Standard attributes here
[WebAuthenticationConfiguration(typeof(WebBasicAuthenticationHandler),
typeof(SecurityValidator),
false,
"SearchService"),
ErrorHandler(typeof(WebErrorHandler))]
public class SearchService
只需将[ErrorHandler(typeof(WebErrorHandler))]
属性添加到服务即可实现所有神奇功能。我知道它必须是简单的,只是希望我能在看到我的桌子上的前额之前看到它。