【问题标题】:How do I authenticate a WCF Data Service?如何对 WCF 数据服务进行身份验证?
【发布时间】:2011-02-20 13:31:40
【问题描述】:

我创建了一个托管在 Azure 辅助角色中的 ADO.Net WCF 数据服务。我想将凭据从简单的控制台客户端传递到服务,然后使用 QueryInterceptor 验证它们。不幸的是,凭证似乎并没有通过网络实现。

以下是我正在使用的代码的简化版本,从服务器上的 DataService 开始:

using System;
using System.Data.Services;
using System.Linq.Expressions;
using System.ServiceModel;
using System.Web;

namespace Oslo.Worker
{
    [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
    public class AdminService : DataService<OsloEntities>
    {
        public static void InitializeService(
            IDataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.All);
            config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
        }

        [QueryInterceptor("Pairs")]
        public Expression<Func<Pair, bool>> OnQueryPairs()
        {
            // This doesn't work!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            if (HttpContext.Current.User.Identity.Name != "ADMIN")
                throw new Exception("Ooops!");

            return p => true;
        }
    }
}

这是我用来在我的 Azure 辅助角色中实例化 AdminService 的 AdminService:

using System;
using System.Data.Services;

namespace Oslo.Worker
{
    public class AdminHost : DataServiceHost
    {
        public AdminHost(Uri baseAddress)
            : base(typeof(AdminService), new Uri[] { baseAddress })
        {
        }
    }
}

最后,这是客户端代码。

using System;
using System.Data.Services.Client;
using System.Net;
using Oslo.Shared;

namespace Oslo.ClientTest
{
    public class AdminContext : DataServiceContext
    {
        public AdminContext(Uri serviceRoot, string userName,
            string password) : base(serviceRoot)
        {
            Credentials = new NetworkCredential(userName, password);
        }

        public DataServiceQuery<Order> Orders
        {
            get
            {
                return base.CreateQuery<Pair>("Orders");
            }
        }
    }
}

我应该提到,代码在凭据没有通过网络传递的信号异常情况下工作得很好。

在这方面的任何帮助将不胜感激!

谢谢....

【问题讨论】:

    标签: wcf wcf-data-services


    【解决方案1】:

    您必须抛出 DataServiceException 类型的异常。

    【讨论】:

    • 我看不出这是一个完整的答案吗?如果凭据在查询拦截器中不可用,它不会总是抛出异常吗?
    • 他的方法总是返回真,直到他改变了异常类型。他一定是在测试虚假身份,对为什么会发生这种情况感到困惑。他认为问题应该是关于凭据,但实际上是关于为什么没有抛出异常。
    猜你喜欢
    • 2011-08-29
    • 2012-07-28
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    相关资源
    最近更新 更多