如何对 WCF 数据服务进行身份验证?

Posted

技术标签:

【中文标题】如何对 WCF 数据服务进行身份验证?【英文标题】:How do I authenticate a WCF Data Service? 【发布时间】: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");
            
        
    

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

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

谢谢....

【问题讨论】:

【参考方案1】:

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

【讨论】:

我看不出这是一个完整的答案吗?如果凭据在查询拦截器中不可用,它不会总是抛出异常吗? 他的方法总是返回真,直到他改变了异常类型。他一定是在测试虚假身份,对为什么会发生这种情况感到困惑。他认为问题应该是关于凭据,但实际上是关于为什么没有抛出异常。

以上是关于如何对 WCF 数据服务进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

具有 CORS 和基本身份验证支持的 WCF 自托管数据服务

如何禁用 WCF 数据服务的身份验证方案

WCF 和自定义身份验证(用户名/密码)

使用 IIS7、WCF Rest、自定义身份验证模块进行模拟

WCF如何传递令牌进行身份验证?

使用 Silverlight 5、IIS 7.5 对 WCF 服务进行 Windows 身份验证