【问题标题】:Authenticating WCF DataServices身份验证 WCF 数据服务
【发布时间】:2010-01-14 07:54:15
【问题描述】:

我正在尝试通过 Silverlight 验证对 WCF DataServices 服务的调用。本质上,当用户登录时,他们会得到一个特殊的散列,该散列应该嵌入到 WCF 数据服务的每个请求的标头中。目前通过 QueryInterceptor 方法将其用作检查,例如

    [QueryInterceptor("Orders")]
    public Expression<Func<Orders,bool>> OnQueryOrders()
    {
        string hash = WebOperationContext.Current.IncomingRequest.Headers.Get("MyHeader");

        if(!TestHash(hash))
        {
            return o => false;
        }
        else
        {
            return o => true;
        }
    }

这似乎是实现这一目标的最糟糕的方法。在运行查询之前运行的 WCF Dataservices 中是否有任何挂钩可用于取消请求?请记住,此服务是无状态的,无法访问会话。

【问题讨论】:

    标签: .net wcf wcf-data-services


    【解决方案1】:

    实际上,我认为我自己解决了这个问题。通过覆盖 OnStartProcessingRequest,如果它不适合,我可以抛出异常,例如

        protected override void OnStartProcessingRequest(ProcessRequestArgs args)
        {
            if (string.IsNullOrEmpty(WebOperationContext.Current.IncomingRequest.Headers.Get("MyMagicHeader")))
            {
                throw new DataServiceException(404, "Access denied!");
            }
            else
            {
                base.OnStartProcessingRequest(args);
            }
        }
    

    【讨论】:

    • 你应该返回 403(禁止)而不是 404(未找到)
    • 太棒了!为什么我们不能这样做来进行身份验证而不是愚蠢的基本客户身份验证。这样比较安全吧?我可以加密消息或令牌并在服务器上对其进行验证。
    【解决方案2】:

    您是否考虑过 WCF 消息检查器?我认为(不保证)消息检查器将在查询拦截器之前被命中,因此您可以检查标头并验证用户散列值。这是一个很好的链接,上面有Writing Message Inspectors的信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多