1

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

该服务使用声明性方法通过使用属性装饰必要的类来实现 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 站点上阅读的内容,其作者 (Mike O'Brian) 发布了一个问题,他说他希望看到它返回除 401 之外的任何内容,因为它当前返回401挑战。

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

更新

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

4

1 回答 1

1

我想到了。我需要用以下方式装饰我的 ServiceContract ErrorHandlerAttribute

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

只需将[ErrorHandler(typeof(WebErrorHandler))]属性添加到服务中,所有的魔法都会发生。我知道它一定很简单,只是希望我能在将前额平放在桌子上之前看到它。

于 2012-02-24T14:05:59.637 回答