Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF 4.0';s模拟WCF静止启动器套件';请求截取器?_Wcf_Wcf Rest Starter Kit - Fatal编程技术网

WCF 4.0';s模拟WCF静止启动器套件';请求截取器?

WCF 4.0';s模拟WCF静止启动器套件';请求截取器?,wcf,wcf-rest-starter-kit,Wcf,Wcf Rest Starter Kit,WCF 4.0是否对WCF REST Starter Kit的RequestInterceptor有模拟类/模块/任何东西?没有任何东西可以将1-1映射到它,但是您可以使用WCF core中的IDispatchMessageInspector来实现RequestInspector将执行的大多数场景。上的帖子有一些关于消息检查器的详细信息。爱德华多,你问:@carlosfigueira:我可以用它来实现一个身份验证子系统吗 我正在处理同一个问题,至少有一个解决方案(如下所述)供您使用,还有一个即将

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

没有任何东西可以将1-1映射到它,但是您可以使用WCF core中的IDispatchMessageInspector来实现RequestInspector将执行的大多数场景。上的帖子有一些关于消息检查器的详细信息。

爱德华多,你问:@carlosfigueira:我可以用它来实现一个身份验证子系统吗

我正在处理同一个问题,至少有一个解决方案(如下所述)供您使用,还有一个即将推出的基于授权标头的解决方案(我相信您正在考虑“拦截”该解决方案)

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

  • 向每个客户端颁发共享密钥和API密钥以用作凭据。API密钥实际上与用户名相同
  • 通过SSL运行所有端点,以确保始终具有通道/消息/数据安全性
  • 要求客户端使用共享密钥生成包含时间戳及其API密钥的HMAC-SHA1(或等效)哈希签名字符串
  • 要求客户端在每个请求中将所有3个作为查询字符串参数传递
    • 签名
    • 时间戳
    • API密钥
    • 示例:{sigString}&ApiKey={ApiKey}&TimeStamp={TimeStamp}&这里的所有其他参数
  • 在您的服务端,实现一种身份验证方法,该方法采用所有3个字符串,然后:
    • 查找API密钥并返回您在数据库或其他地方拥有的客户端共享机密
    • 比较时间戳和日期时间。现在确保请求的时间不超过15分钟,以抵御重播攻击
    • 使用这3个字符串,重新创建签名字符串,并将您的签名字符串与客户端传入的签名字符串进行比较
    • 如果它们匹配,则请求者是真实的
  • 现在,更好的方法是使用HTTP授权请求头来存储这3个字符串,并让全局拦截器ish进程监视所有请求。这将防止在没有身份验证块的情况下暴露端点的可能性(至少不太可能)

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

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


    我将尽最大努力发布实现查询字符串和auth头方法的代码块。

    我回来更新了

    我碰巧看重代码的简单性,在成功解决了这个问题之后,我不能说我更喜欢它而不是查询字符串方法。在调用AuthZ方法的同时,向每个调用AuthN方法的服务端点删除一个调用似乎比一些人想象的要容易

    不管怎样,关于解决方案的意见已经够多了。这个解决方案就在我们的眼前,在这个链接上是Stackoverflow,但在我们的上下文中没有很好地描述……因此,我要感谢“user634119”,因为这里的示例代码:

    首先,我们需要将serviceBehavior添加到web.config文件:

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceAuthenticationManager serviceAuthenticationManagerType="WCF.BasicAuthorization, WCF"></serviceAuthenticationManager>
          <serviceAuthorization impersonateCallerForAllOperations="false" principalPermissionMode="Custom" serviceAuthorizationManagerType="WCF.BasicAuthentication, WCF">
          </serviceAuthorization>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
    接下来创建一个身份验证类:

    // 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
        }
    }
    
    //按照我上一篇文章中的描述对标题签名进行身份验证
    公共类基本身份验证:ServiceAuthenticationManager
    {
    公共覆盖只读集合身份验证(
    只读集合授权策略,Uri listenUri,
    参考信息(信息)
    {
    //一些代码
    }
    }
    

    在Authenticate方法中,使用HttpRequestMessageProperty提取请求标头的详细信息,并执行我在第一次答复中描述的相同的3个步骤。

    我可以使用它实现身份验证子系统吗?我已经阅读/遵循了大量关于保护WCF 4.0实现的基于REST的服务的教程。没有一个能提供简单的解决方案。但这似乎是实现身份验证和授权的最优雅的解决方案。
    // 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
        }
    }