2010-05-17 61 views
6

He creado un ADO.Net Servicio de datos WCF alojado en un rol de trabajador de Azure. Quiero pasar las credenciales de un cliente de consola simple al servicio y luego validarlas usando un QueryInterceptor. Desafortunadamente, las credenciales no parecen estar llegando al límite.¿Cómo autentico un servicio de datos WCF?

La siguiente es una versión simplificada del código que estoy usando, empezando por el DataService en el servidor:

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; 
     } 
    } 
} 

Aquí está la AdminService que estoy usando para crear una instancia del AdminService en mi rol de trabajo Azure:

using System; 
using System.Data.Services; 

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

Y finalmente, aquí está el código del cliente.

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"); 
      } 
     } 
    } 
} 

Debo mencionar que el código funciona muy bien con la excepción de la señal de que las credenciales no se pasan por el cable.

¡Cualquier ayuda en este sentido sería muy apreciada!

Gracias ....

Respuesta

1

Usted debe lanzar una excepción de tipo DataServiceException.

+0

No veo cómo esta es una respuesta completa? Si las credenciales no están disponibles en el interceptor de consultas, ¿no lanzará siempre la excepción? – tjrobinson

+0

Su método siempre volvería verdadero hasta que cambió el tipo de excepción. Él debe haber estado probando identidades falsas y estaba confundido en cuanto a por qué esto estaba sucediendo. Pensó que la pregunta debería ser acerca de las credenciales, pero realmente se trataba de por qué la excepción no estaba siendo lanzada. –