使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)