2009-07-28 8 views
17

Estoy trabajando con Silverlight RIA Services y quiero crear una autenticación personalizada. Esto parece ser lo único que prácticamente no tiene documentación (he leído todo el RIAServicesOverview.docx).Servicios RIA: ¿Cómo puedo crear una autenticación personalizada?

¿Conoces alguna forma de crear un servicio de autenticación de clientes? No quiero usar el modelo de membresía predeterminado de ASP.NET. No sé qué interfaz o clase abstracta necesito implementar, aunque encontré System.Web.Ria.ApplicationServices.IAuthentication.

¿Debo implementar IAuthentication? Si es así, ¿podría darme algunos consejos sobre cómo hacerlo? Estos son los métodos siguientes:

public User GetUser(); 

    public User Login(string userName, string password, bool isPersistent, string customData); 

    public User Logout(); 

    public void UpdateUser(User user); 

que no sé cómo iba a poner en práctica cualquiera de estos (a excepción de inicio de sesión) - ¿cómo podría el servicio posiblemente saber qué usuario ha iniciado la sesión con el fin de Salir() para ¿trabajo?

He estado recorriendo la web en busca de cómo hacerlo durante horas, y no encuentro nada que describa cómo crear un servicio de dominio simple que pueda usarse para autenticar a un usuario en un "enlace RIA" "Proyecto Silverlight.

Si alguien pudiera arrojar algo de luz sobre esto, estaría sinceramente agradecido.

Gracias,
Charles


[EDIT]
encontré el RIA Services page on the MSDN Code Gallery. Hay una sección llamada Authentication Samples, que enlaza con algunas excelentes muestras de código. Compruébelo si quiere saber más sobre cómo funciona la autenticación dentro de los Servicios de RIA.

Respuesta

20

Si crea una "Aplicación empresarial Silverlight", verá cómo la plantilla implementa la autenticación. (O simplemente ir here and download the template sample project.)

Para simplificar, aquí está el proceso utilicé:

En primer lugar, se crea un servicio de dominio (FooService) que se deriva de LinqToEntitiesDomainService donde FooContext es mi modelo de entidad. En él, agrego todas las operaciones CRUD para acceder a mi tabla DB personalizada y devolver los perfiles de usuario.

A continuación, cree una clase de usuario concreta sobre el serverside derivando de UserBase:

using System.Web.Ria; 
using System.Web.Ria.ApplicationServices; 

public class User : UserBase 
{} 

Por último, derivar una clase de AuthenticationBase y poner en práctica los cuatro métodos siguientes:

[EnableClientAccess] 
public class AuthenticationService : AuthenticationBase<User> 
{ 
    private FooService _service = new FooService(); 

    protected override bool ValidateUser(string username, string password) 
    { 
     // Code here that tests only if the password is valid for the given 
     // username using your custom DB calls via the domain service you 
     // implemented above 
    } 

    protected override User GetAuthenticatedUser(IPrincipal pricipal) 
    { 
     // principal.Identity.Name will be the username for the user 
     // you're trying to authenticate. Here's one way to implement 
     // this: 
     User user = null; 
     if (this._service.DoesUserExist(principal.Identity.Name)) // DoesUserExist() is a call 
                    // added in my domain service 
     { 
      // UserProfile is an entity in my DB 
      UserProfile profile = this._service.GetUserProfile(principal.Identity.Name); 
      user.Name = profile.UserName; 
      user.AuthenticationType = principal.Identity.AuthenticationType; 
     } 
     return user; 
    } 

    public override void Initialize(DomainServiceContext context) 
    { 
     this._service.Initialize(context); 
     base.Initialize(context); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
      this._service.Dispose(); 
     base.Dispose(disposing); 
    } 
} 
+0

Gracias, eso es lo que estaba buscando. Cheers – Charles

+0

* buscando * ... Mis dedos de mantequilla y no me importaría una opción Editar para comentarios ... – Charles

+0

¿Podría explicar esta respuesta con un poco más de detalle?Realmente estoy luchando por implementar una autenticación normal y no puedo encontrar ninguna buena fuente de información que no sea totalmente ambigua y que ya tenga conocimiento. Realmente agradecería algo de ayuda. – Goober

0

¿Qué hay de la implementación la interfaz IAuthorization?

Cuestiones relacionadas