【发布时间】:2011-08-26 18:12:05
【问题描述】:
WCF 4.0 是否对 WCF REST Starter Kit 的 RequestInterceptor 有一个模拟类/模块/任何东西?
【问题讨论】:
WCF 4.0 是否对 WCF REST Starter Kit 的 RequestInterceptor 有一个模拟类/模块/任何东西?
【问题讨论】:
我回来更新了。
我碰巧看重代码的简单性,在成功解决了这个问题之后,我不能说我比查询字符串方法更喜欢它。将单个调用放入调用 AuthN 方法和 AuthZ 方法的每个服务端点似乎比某些人想象的要容易。
无论如何,关于解决方案的意见已经够多了。该解决方案就在我们对 Stackoverflow 的关注下,但在我们的上下文中没有很好地描述......所以我将把这里找到的示例代码归功于“user634119”: Headers in OperationContext
首先,我们需要在 web.config 文件中添加一个 serviceBehavior:
<behaviors>
<serviceBehaviors>
<behavior>
<serviceAuthenticationManager serviceAuthenticationManagerType="WCF.BasicAuthorization, WCF"></serviceAuthenticationManager>
<serviceAuthorization impersonateCallerForAllOperations="false" principalPermissionMode="Custom" serviceAuthorizationManagerType="WCF.BasicAuthentication, WCF">
</serviceAuthorization>
</behavior>
</serviceBehaviors>
</behaviors>
接下来创建一个类(在上面的 serviceBehaviors 块中引用称为 BasicAuthorization):
//Authorize the call against the URI resource being requested...
public class BasicAuthorization : ServiceAuthorizationManager
{
public override bool CheckAccess(OperationContext operationContext,
ref Message message)
{
//some code
}
}
接下来创建一个 Authentication 类:
// Authenticate the header signature as described in my previous post
public class BasicAuthentication : ServiceAuthenticationManager
{
public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(
ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri,
ref Message message)
{
//some code
}
}
在 Authenticate 方法中,使用 HttpRequestMessageProperty 提取请求标头详细信息并执行与我的第一个回复中描述的相同的 3 个步骤。
【讨论】:
Eduardo,您问:@carlosfigueira:我可以用它来实现身份验证子系统吗?
我正在解决同样的问题,并且至少为您提供了一种解决方案(如下所述)以及即将推出的基于授权标头的解决方案(我相信您正在考虑“拦截”)。
保护基于 WCF 4 REST WebHttp 编程模型的端点的最简单方法是:
现在,更好的方法是使用 HTTP 授权请求标头来存储这 3 个字符串,并让一个全局拦截器式进程监视所有请求。这将防止没有身份验证块的暴露端点的可能性(好吧,至少它不太可能)。
使用查询字符串来携带所有这些信息的问题是查询字符串的最大长度为 2k(因客户端/浏览器而异),并且在调试时查询字符串变得非常难以阅读......但只是习惯它。
有些人认为更复杂的方法是 STS 模型,您需要客户端将这 3 个身份验证字符串传递给安全令牌服务端点。响应消息将传回一个会话令牌,客户端将在每次调用时传入该令牌以代替 3 个字符串。确实,对于客户端而言,每次调用都不需要生成 HMAC 哈希签名,但服务器端仍然必须对令牌进行身份验证,并且会话概念会破坏干净的 RESTful 无状态行为。
我将尽我所能发布实现查询字符串和 auth 标头方法的代码块。
【讨论】:
没有任何东西可以将 1-1 映射到它,但是您可以使用 WCF 核心中的 IDispatchMessageInspector 来实现 RequestInspector 可以执行的大多数方案。 http://blogs.msdn.com/b/carlosfigueira/archive/2011/04/19/wcf-extensibility-message-inspectors.aspx 的帖子有一些关于消息检查器的详细信息。
【讨论】: