2009-07-28 7 views
17

Je travaille avec les services RIA Silverlight et je souhaite créer une authentification personnalisée. Cela semble être la seule chose qui n'a pratiquement aucune documentation (j'ai lu tout le RIAServicesOverview.docx).Services RIA: Comment créer une authentification personnalisée?

Connaissez-vous un moyen pour moi de créer un service d'authentification client? Je ne souhaite pas utiliser le modèle d'appartenance ASP.NET par défaut. Je ne sais pas quelle interface ou classe abstraite je dois implémenter - bien que j'ai trouvé System.Web.Ria.ApplicationServices.IAuthentication.

Dois-je implémenter IAuthentication? Si oui, pourriez-vous me donner quelques conseils sur la façon de s'y prendre? Ce sont les méthodes suivantes:

public User GetUser(); 

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

    public User Logout(); 

    public void UpdateUser(User user); 

Je ne sais pas comment je mettre en œuvre l'un de ces (sauf pour la connexion) - comment le service pourrait peut-être savoir ce que l'utilisateur actuellement connecté afin de déconnecter() à travail?

J'ai parcouru le web à la recherche de comment faire cela pendant des heures, et je ne trouve rien qui décrit comment créer un DomainService simple qui peut être utilisé pour authentifier un utilisateur dans un "RIA-linked "Projet Silverlight.

Si quelqu'un pouvait faire la lumière sur ce sujet, je serais sincèrement reconnaissant.

Merci,
Charles


[EDIT]
J'ai trouvé le RIA Services page on the MSDN Code Gallery. Il y a une section appelée Authentication Samples, qui contient des liens vers d'excellents exemples de code. Découvrez-le si vous voulez en savoir plus sur le fonctionnement de l'authentification dans les services RIA.

Répondre

20

Si vous créez une "Application métier Silverlight", vous verrez comment le modèle implémente l'authentification. (Ou tout simplement aller here and download the template sample project.)

Pour simplifier, voici le processus je:

Tout d'abord, je crée un service de domaine (FooService) qui dérive de LinqToEntitiesDomainService où FooContext est mon modèle d'entité. J'y ajoute toutes les opérations CRUD pour accéder à ma table DB personnalisée et renvoyer des profils utilisateur.

Ensuite, créez un béton classe utilisateur sur le Serverside en dérivant de UserBase:

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

public class User : UserBase 
{} 

Enfin, dériver une classe de AuthenticationBase et mettre en œuvre les quatre méthodes suivantes:

[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

Merci, c'est ce que je cherchais. Cheers – Charles

+0

* cherche * ... Mes doigts de beurre et je ne me dérangerait pas une option d'édition pour les commentaires ... – Charles

+0

S'il vous plaît pourriez-vous expliquer cette réponse dans un peu plus de détails?J'ai vraiment du mal à implémenter une authentification normale et je ne trouve aucune bonne source d'information qui ne soit pas totalement ambiguë et qui suppose déjà des connaissances. J'apprécierais volontiers de l'aide. – Goober

0

Que diriez-vous la mise en œuvre l'interface IAuthorization?