如何对 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 自托管数据服务