使用 WebAuthenticationConfiguration 时启用 401 质询响应
Posted
技术标签:
【中文标题】使用 WebAuthenticationConfiguration 时启用 401 质询响应【英文标题】:Enabling 401 Challenge responses when using WebAuthenticationConfiguration 【发布时间】:2012-03-14 11:30:56 【问题描述】:我有一个非常简单的 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 site 上读到的内容,an issue posted by its author (Mike O'Brian) 说他希望看到它返回任何东西除了我读到的 401 当前返回401 挑战。
如果有这个功能,那么我错过了什么,还是我做错了什么?
更新
如果无法使用 WcfRestContrib 执行此操作,是否有其他方法可以实现此操作(在 IIS 中使用标准的基于 Windows 的基本身份验证除外)?我对任何(其他)替代解决方案持开放态度。
【问题讨论】:
【参考方案1】:我想通了。我需要用ErrorHandlerAttribute
装饰我的ServiceContract:
// Standard attributes here
[WebAuthenticationConfiguration(typeof(WebBasicAuthenticationHandler),
typeof(SecurityValidator),
false,
"SearchService"),
ErrorHandler(typeof(WebErrorHandler))]
public class SearchService
只需将[ErrorHandler(typeof(WebErrorHandler))]
属性添加到服务中,所有的魔法都会发生。我知道它一定很简单,只是希望我能在将前额平放在桌子上之前看到它。
【讨论】:
以上是关于使用 WebAuthenticationConfiguration 时启用 401 质询响应的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)