silverlight 3.0 - Servicios RIA: ¿Cómo puedo crear una autenticación personalizada?
silverlight-3.0 wcf-ria-services (3)
Estoy trabajando con los Servicios RIA de Silverlight 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).
¿Conoces alguna forma de crear un servicio de autenticación de clientes? No quiero usar el modelo de membresía ASP.NET predeterminado. No sé qué interfaz o clase abstracta necesito implementar, aunque encontré System.Web.Ria.ApplicationServices.IAuthentication.
¿Necesito implementar IAuthentication? Si es así, ¿podría darme algún consejo sobre cómo hacerlo? Estos son los siguientes métodos:
public User GetUser();
public User Login(string userName, string password, bool isPersistent, string customData);
public User Logout();
public void UpdateUser(User user);
No sé cómo implementaría ninguno de estos (a excepción del inicio de sesión). ¿Cómo podría saber el servicio en qué usuario ha iniciado sesión actualmente para que Logout () funcione?
He estado recorriendo la web en busca de cómo hacer esto durante horas, y no puedo encontrar nada que describa cómo crear un Servicio de Dominio simple que pueda usarse para autenticar a un usuario en un proyecto Silverlight "vinculado a RIA".
Si alguien pudiera arrojar algo de luz sobre esto, estaría sinceramente agradecido.
Gracias,
Charles
[EDITAR]
Encontré la página de servicios de RIA en la galería de códigos de MSDN . Hay una sección llamada Muestras de autenticación , que enlaza con algunas excelentes muestras de código. Compruébelo si desea saber más acerca de cómo funciona la autenticación en los Servicios de RIA.
¿Qué hay de la implementación de la interfaz de IAuthorization
?
Aquí hay un completo ejemplo oficial de MS:
http://code.msdn.microsoft.com/Custom-Authentication-96ca3d20
Si creas una "aplicación comercial de Silverlight", verás cómo la plantilla implementa la autenticación. (O simplemente vaya aquí y descargue el proyecto de muestra de la plantilla ).
Para simplificar, aquí está el proceso que utilicé:
Primero, creo 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 de base de datos personalizada y devolver los perfiles de usuario.
A continuación, cree una clase de usuario concreta en el lado del servidor derivando de UserBase:
using System.Web.Ria;
using System.Web.Ria.ApplicationServices;
public class User : UserBase
{}
Finalmente, derive una clase de AuthenticationBase e implemente los siguientes cuatro métodos:
[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);
}
}