【问题标题】:WCF 4.0's analog to WCF REST Starter Kit's RequestInterceptor?WCF 4.0 类似于 WCF REST Starter Kit 的 RequestInterceptor?
【发布时间】:2011-08-26 18:12:05
【问题描述】:

WCF 4.0 是否对 WCF REST Starter Kit 的 RequestInterceptor 有一个模拟类/模块/任何东西?

【问题讨论】:

    标签: wcf wcf-rest-starter-kit


    【解决方案1】:

    我回来更新了。

    我碰巧看重代码的简单性,在成功解决了这个问题之后,我不能说我比查询字符串方法更喜欢它。将单个调用放入调用 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 个步骤。

    【讨论】:

    • 我一直在阅读/关注大量关于保护使用 WCF 4.0 实现的基于 REST 的服务的教程。没有一个提供直接的解决方案。但这似乎是实现身份验证和授权的最优雅的解决方案。
    【解决方案2】:

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

    我正在解决同样的问题,并且至少为您提供了一种解决方案(如下所述)以及即将推出的基于授权标头的解决方案(我相信您正在考虑“拦截”)。

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

    1. 向每个客户端颁发共享密钥和 API 密钥以用作凭据。 API 密钥实际上与用户名相同。
    2. 通过 SSL 运行所有端点以确保您始终拥有通道/消息/数据安全
    3. 要求客户端使用共享密钥生成包含时间戳及其 API 密钥的 HMAC-SHA1(或等效)哈希签名字符串。
    4. 要求客户端将所有这 3 个作为查询字符串参数传递在每个请求中
    5. 在您的服务端,实现一个接受所有 3 个字符串的身份验证方法,然后:
      • 查找 API 密钥并返回在数据库或其他地方拥有的客户端共享密钥。
      • 将时间戳与 DateTime.Now 进行比较,以确保请求不超过 15 分钟,以抵御重放攻击。
      • 使用这 3 个字符串,重新创建签名字符串并将您的字符串与客户端传入的字符串进行比较。
      • 如果它们匹配,则请求者是真实的。

    现在,更好的方法是使用 HTTP 授权请求标头来存储这 3 个字符串,并让一个全局拦截器式进程监视所有请求。这将防止没有身份验证块的暴露端点的可能性(好吧,至少它不太可能)。

    使用查询字符串来携带所有这些信息的问题是查询字符串的最大长度为 2k(因客户端/浏览器而异),并且在调试时查询字符串变得非常难以阅读......但只是习惯它。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我可以用它来实现一个认证子系统吗?
      猜你喜欢
      • 2010-12-19
      • 2011-03-16
      • 2010-10-06
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 2023-03-05
      • 2011-03-27
      相关资源
      最近更新 更多