WCF 4.0类似于WCF REST入门套件的RequestInterceptor?

时间:2011-05-16 20:39:53

标签: wcf wcf-rest-starter-kit

WCF 4.0是否有模拟类/模块/ WCF REST Starter Kit的RequestInterceptor?

3 个答案:

答案 0 :(得分:7)

我回来了。

我碰巧重视代码中的简单性,在成功解决了这个问题之后,我不能说我更喜欢它,而不是查询字符串方法。将一个调用放入调用AuthN方法和Aut​​hZ方法的每个服务端点似乎比有些人想象的要容易。

无论如何,有足够的意见......对解决方案。我们在这个链接上的解决方案就在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个步骤。

答案 1 :(得分:4)

Eduardo,你问:@carlosfigueira:我可以用它来实现身份验证子系统吗?

我正在研究同样的问题,并且至少有一个解决方案(如下所述)和即将推出的基于授权标题的解决方案(我相信你正在考虑“拦截”)。

保护基于WCF 4 REST WebHttp编程模型的端点的最简单方法是:

  1. 向每个客户端发出共享密钥和API密钥以用作凭据。 API密钥与用户名实际上相同。
  2. 通过SSL运行所有端点以确保始终具有通道/消息/数据安全性
  3. 要求客户端使用共享密钥生成HMAC-SHA1(或等效)散列签名字符串,其中包含时间戳及其API密钥。
  4. 要求客户端将所有这三个参数作为查询字符串参数传递给每个请求
    • 签名
    • 时间戳
    • API密钥
    • 示例:https://127.0.0.1/RestEndpoint?Sig= {sigString}&amp; ApiKey = {apiKey}&amp; TimeStamp = {timeStamp}&amp;此处所有其他参数......
  5. 在服务端,实现一个需要3个字符串的Authentication方法,然后:
    • 查找API密钥并返回在数据库或其他位置拥有的客户端共享密钥。
    • 将时间戳与DateTime.Now进行比较,以确保请求的时间不超过15分钟,以抵御重播攻击。
    • 使用这3个字符串,重新创建签名字符串,并将您的字符串与客户端传入的字符串进行比较。
    • 如果匹配,则请求者是真实的。
  6. 现在,更好的方法是使用HTTP授权请求标头来存储这3个字符串,并让全局拦截器进程监视所有请求。这样可以防止没有认证块的暴露端点的可能性(好吧,至少它可能不太可能)。

    使用查询字符串来携带所有这些信息的问题是查询字符串的最大长度为2k(因客户端/浏览器而异),调试时查询字符串很难读取...但只是习惯了它

    有些人认为更复杂的方法是使用STS模型,您需要客户端将这3个身份验证字符串传递给安全令牌服务端点。响应消息将传回会话令牌,客户端将在每次调用时传入该会话令牌以代替3个字符串。确实,对于客户端,不需要在每次调用时生成HMAC哈希签名,但是服务器端仍然必须验证令牌,并且会话概念会破坏干净的RESTful无状态行为。

    我会尽力发布实现查询字符串和auth标头方法的代码块。

答案 2 :(得分:3)

没有任何内容可以将1-1映射到它,但是您可以使用WCF核心中的IDispatchMessageInspector来实现RequestInspector将执行的大多数方案。 http://blogs.msdn.com/b/carlosfigueira/archive/2011/04/19/wcf-extensibility-message-inspectors.aspx上的帖子提供了有关信息检查员的一些详细信息。