Affichage des articles dont le libellé est HappyNet. Afficher tous les articles
Affichage des articles dont le libellé est HappyNet. Afficher tous les articles

HappyNet Silverlight Prism MVVM - Processus d'authentification

Comment permettre à un utilisateur de s'authentifier dans le projet HappyNet ?

HappyNet Connexion et Authentification
Entrons directement dans le vif du sujet, la partie UI est présente dans :
\\HappyNet-SL5\Client\Module\
Soat.HappyNet.Silverlight.Modules.Main\Views\LoginState\LoginStateView.xaml
<Button x:Name="LoginButton"
   cal:Click.Command="{Binding LoginCommand}"

Si l'on tape sur "Enter" le processus d'authentification démarre grâce au trigger :

                        <i:Interaction.Triggers>
                            <triggers:KeyTrigger Key="Enter">
                                <action:ExecuteCommandAction Command="{Binding LoginCommand}" />
                            </triggers:KeyTrigger>
                        </i:Interaction.Triggers>

Code de LoginCommand :
\\HappyNet-SL5\Client\Module\Soat.HappyNet.Silverlight.Modules.Main\Views\LoginState\ILoginStateViewModel.cs
\\HappyNet-SL5\Client\Module\Soat.HappyNet.Silverlight.Modules.Main\Views\LoginState\LoginStateViewModel.cs

public void InitializeCommands()
{
     this.LoginCommand = new DelegateCommand(this.OnLogin,
                () => !string.IsNullOrEmpty(this.UserName) && !string.IsNullOrEmpty(this.Password));

public void OnLogin()
{
            IsLoading = true;
            mainService.BeginLogin(this.UserName, this.Password, LoginCompleted);
}

\\HappyNet-SL5\Client\Module\Soat.HappyNet.Silverlight.Modules.Main\Services\MainService.cs

public void BeginLogin(string user, string password, ServiceCompleted<User> LoginCompleted)
{
            client.LoginAsync(user, password,
                new ServiceArgs<User>(LoginCompleted));
}

Autrement dit, on ne voit absolument pas dans quelle BD ni dans quelle table ni quel champ on utilise pour authentifier un utilisateur ... c'est de la magie encore une fois.

Authentification avec Silverlight et AdventureWorks

J'ai continué de chercher comment s'authentifier avec HappyNet et je suis tombé sur la page suivante :

On y voit d'ailleurs que l'on fait un "Add Exiting Item" de la Data Base AdventureWorks dans le répertoire App_Data ce qui est à mon sens une bonne chose pour le déploiement de l'application ...

Un problème avec Entity Framework et Available Context Class, la solution est Ici.





Silverlight Navigation and Authentification Application

Sur le sujet de l'authentification dans une application web, j'avais déjà écris beaucoup de choses et notamment développé un projet du Codeplex : http://loginmodule.codeplex.com/

Je suis donc curieux de découvrir l'état de l'art dans les applications Silverlight ... et je suis donc en train de lire les pages suivantes :

http://msdn.microsoft.com/fr-fr/library/ee942451(v=vs.91).aspx
Procédure pas à pas : Utilisation du service d'authentification avec une application de navigation Silverlight

Et la page :

http://msdn.microsoft.com/fr-fr/library/ee942449(v=vs.91).aspx
Procédure pas à pas : Utilisation du service d'authentification avec une application métier Silverlight

Pour constater, avec joie, qu'il n'y a pas grand chose de nouveau sous le soleil.

La première page "Utilisation du service d'authentification avec une application de navigation Silverlight" nous amène progressivement à la création de formulaires utilisateurs susceptibles de réaliser l'enregistrement et l'authentification de cet utilisateur à travers les WCF Ria Services, ce qui est déjà réalisé dans la deuxième page.

J'ai donc crée une Business Silverlight Application donc la structure est la suivante :

Silverlight Business Application Structure
Cette application Silverlight est hostée par une application web ASP.NET :

ASP.NET Application qui hoste le MyBusinessApplication.xap
Au passage, on peut noter que tout est déjà fait au niveau des WCF Ria Services pour qu'un utilisateur puisse s'enregistrer et s'authentifier au sein de l'application.

Et après avoir utilisé le formulaire d'enregistrement pour un nouvel utilisateur :

Siverlight WCF Ria Services enregistrement d'un nouvel utilisateur 
La fameuse base de donnée SQL Server : ASPNETDB.MDF apparaît comme par enchantement dans le répertoire App_Data de mon application ASP.NET Web :
\\Silverlight\MyBusinessApplication\MyBusinessApplication.Web\App_Data

Et je suis authentifié au sein de mon application Silverlight hostée par l'ASP.NET Web application :

Manager utilisateur créé et authentifié
Cette application met en oeuvre l'utilisation de l'objet Membership du namespace System.Web.Security afin de créer un nouvel utilisateur authentifié :

Dans :
\\Silverlight\MyBusinessApplication\MyBusinessApplication.Web\Services\UserRegistrationService.cs

    [EnableClientAccess]
    public class UserRegistrationService : DomainService

On utilise :
Membership.CreateUser(user.UserName, password, user.Email, user.Question, user.Answer, true, null, out createStatus);

Pour créer un nouvel utilisateur dans un rôle par défaut :
Roles.AddUserToRole(user.UserName, UserRegistrationService.DefaultRole);

Conclusion

Ces mécanismes d'enregistrement et d'authentification des utilisateurs sont toujours les mêmes, ils sont parfaitement maîtrisés et utilisés pour la gestion des rôles et des utilisateurs dans une application web. C'est par eux qu'ils faut impérativement passer et sinon pourquoi réinventer une roue qui existe déjà. C'est le problème que nous avons lorsque nous utilisons un projet comme HappyNet qui ne fonctionne pas de la même façon et du coup ne fonctionne pas du tout.





AdventureWorks for HappyNet v1.2

Le projet HappyNet possède un écueil de taille ; la BD AdventureWorks n'est pas installée et du coup il ne fonctionne pas !

On trouvera dans la documentation que l'on peut trouver une version de la BD Ici.

HappyNet v1.2 où est la base de donnée ?

HappyNet utilise Entity Framework pour fournir un modèle de la base AdventureWorks ce modèle est utilisé ensuite par les services WCF Services de la partie Silverlight.

Ce modèle entity se touve dans :
\\HappyNet v1.2 - SL5
\HappyNet-SL5
\Server\Core\Soat.HappyNet.Server.Entities\EntitiesModel.edmx

Mais que faire pour mettre en oeuvre la BD ?

Je parcours le projet et trouve dans le fichier :
\\HappyNet v1.2 - SL5\HappyNet-SL5\
Server\Core\Soat.HappyNet.Server.Entities\App.Config

Je trouve une ConnectionString :

 <!-- /!\ INSTALL NOTE /!\ Fill in the correct configuration to access your database -->
<add name="AdventureWorks2008" connectionString="Database=AdventureWorks_Data;Server=MyServer;Integrated Security=True;User ID=Username;Password=Password" providerName="System.Data.SqlClient" />

Cela ne risque pas de fonctionner !

Remarques : 

Je trouve le découpage du projet un peu curieux ...
Quelque chose de plus classique aurait été de mettre la BD dans le répertoire App_Data :
\HappyNet-SL5\Web\Soat.HappyNet.WebSite\App_Data\AdventureWorks_Data.mdf

Et donc le modèle entity dans Soat.HappyNet.WebSite qui est l'application Web qui hoste le .xap.

Autre remarque au niveau découpage du projet, le code behind des services comme par exemple :
HappyNet-SL5\Web\Soat.HappyNet.WebSite\Services\HumanResourcesService.svc
Se trouve dans :
\HappyNet-SL5\Server\Service\Soat.HappyNet.Server.Services.HumanResources\ServiceLayer\HumanResourcesService.cs

Dans HappyNet on trouve dans le projet Soat.HappyNet.Server.Entities
\HappyNet-SL5\Server\Core\Soat.HappyNet.Server.Entities\App.Config

<add name="AdventureWorksModel" connectionString="metadata=res://*/EntitiesModel.csdl|res://*/EntitiesModel.ssdl|res://*/EntitiesModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=TRAININGSQL;Initial Catalog=AdventureWorks2008;Persist Security Info=True;User ID=Silverlight;Password=pouetpouet!;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

Cela ne risque pas de fonctionner sur votre machine de développement !

Trouver la bonne chaîne de connexion

Astuce pour trouver la bonne chaîne de connexion :
Sur le projet :
\HappyNet v1.2 - SL5\HappyNet-SL5\Server\Core\Soat.HappyNet.Server.Entities
Je fais :
Add->NewItem->ADO Entity Data Model->que je nomme AdventureWorks
Et je regarde regarde la chaîne de connexion générée, je trouve:

<add name="AdventureWorksModel" connectionString="metadata=res://*/EntitiesModel.csdl|res://*/EntitiesModel.ssdl|res://*/EntitiesModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;attachdbfilename=|DataDirectory|\AdventureWorks_Data.mdf;integrated security=True;connect timeout=30;user instance=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Cela me parait être mieux.

Malgré tout à l'exécution j'aurais toujours un "Acces Denied" !

Autres tentatives

J'ai essayé de générer la BD à partir du Modèle Entity, cela ne fonctionne pas non plus ... Il manque alors certaines procédures stockées ...
Je ne trouve pas le moyen d'exécuter la procédure de création d'un utilisateur ...
Lorsque je tente de me connecter j'obtients l'erreur suivante :

{ExceptionDetail, probablement créé par IncludeExceptionDetailInFaults=true, dont la valeur est :

System.Data.EntityException: The underlying provider failed on Open. 
----> System.Data.SqlClient.SqlException: Unable to open the physical file 
"HappyNet-SL5\Web\Soat.HappyNet.WebSite\App_Data\AdventureWorks_Data.mdf". 
Operating system error 5: "5(Accès refusé.)".

An attempt to attach an auto-named database for file 
\\HappyNet-SL5\Web\Soat.HappyNet.WebSite\App_Data\AdventureWorks_Data.mdf failed. 
A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

Sympathique comme erreur est ce que cela vient du répertoire où j'ai positionné la BD ?
Si j'essaye de la mettre dans :
\HappyNet-SL5\Server\Core\Soat.HappyNet.Server.Entities
Etant donné que d'autres projets font référence à celui-ci la BD est copiée autant de fois dans Bin et Debug et mon disque stature rapidement ...

J'arrête de perdre mon temps ...

Accès à la démonstration en ligne

A l'adresse suivante :

En cliquant sur le bouton "Ressources Humaines", on obtient le message "Access Denied" c'est rassurant :

HappyNet : Acces Denied
Vous avez certainement lu quelque part que l'on peut s'identifier avec demo/demo et ça fonctionne en effet :

HappyNet : Accès aux Ressources Humaines
Exécution dans chrome, accès à la partie Boutique :

HappyNet : Accès à la Boutique
Ca fonctionne ! Et Silverlight v5.0 est bien compatible avec Chrome.

Comment créer et authentifier un utilisateur ...

Conclusions

Oui c'est souvent le cas des projets Open Sources du Codeplex et surtout si vous avez derrière une société à but non lucratif, la Base de Donnée est très difficile à installer à configurée et souvent la "vraie" bd du projet n'est pas accessible facilement . Il faudra certainement faire appelle à leurs services moyennant quelques finances mais après tout c'est le jeux ...

Vous aurez remarqué au passage l'extrême lenteur d'exécution de ce type d'application, si vous avez une machine un peu ancienne, elle sera à genoux !

Je suis surpris de l'exécution dans le navigateur Chrome mais c'est une très bonne surprise. Après la disparition de Flash aucune nouvelles plateformes ne voulant plus installer son plug-in, on peut penser que les applications Silverlight ont encore un peu d'avenir.

HappyNet v1.2 - Exécution dans le navigateur Chrome

Au passage, curieux de savoir si mon exemplaire HappyNet, application Silverlight Hostée par une appli ASP.NET fonctionne, je copy colle l'url de mon application dans Chrome :

Et dans Chrome HappeNet fonctionne ?
Au miracle ça fonctionne ...

HappyNet v1.2 - Silverlight MVVM Prims

HappyNet v1.2 description

Superbe projet réalisé en Silverlight 5.0 sous Visual Studio 2010 avec une architecture MVVM utilisant Prism. Je peux le dire maintenant, c'est un véritable joyaux que je vais tenter de mettre en oeuvre sur ma machine et tenter de voir de quoi il retourne.

Requirements :
Au moment ou je tente d'explorer ce projet j'ai installé sur ma machine de dev :
Visual Studio 2010
Sivlerlight 5
Prims 4.1.0

Ce projet et ses sources se trouvent dans le Codeplex à l'adresse suivante :
http://happynet.codeplex.com/releases
http://happynet.codeplex.com/releases/view/96450

Démonstration en ligne :
http://silverlight.soat.fr/#Demonstrations

J'ai trouvé d'autre version de ce projet dans AllInOnSamples, trop ancienne Silverlight 3.0
Je suis donc assez content que l'auteur Cyril Cathala est réalisé un update de son magnifique projet.

Est-il facile à installer, à utiliser ?
On télécharge les sources dans une répertoire de travail et là au moment de cliquer sur la solution c'est la catastrophe !

Problèmes rencontrés dès le départ

Dans :
\\HappyNet v1.2 - SL5 ref\HappyNet-SL5\_Install
Le fichier :
Install.txt parle de procédures stockées dans un répertoire : _Documentation qui n'existe pas dans la release ! et pourtant dans ce répertoire on a bien deux procédures stockées. Ce n'est donc pas encore perdu.

Il existe deux ensemble de librairies Prism dans :
\\HappyNet v1.2 - SL5 ref\HappyNet-SL5\_Assemblies\Prism
Et dans :
\\HappyNet v1.2 - SL5 ref\HappyNet-SL5\packages\Prism.4.1.0.0\lib\SL5
Prims aurait été installé comme NuGetPackage

Directives Using

Les directives using utilisent : Prism.composite ...
using Microsoft.Practices.Composite.UnityExtensions;
using Microsoft.Practices.Composite.Modularity;
using Microsoft.Practices.Composite.Regions;
using Microsoft.Practices.Composite.Presentation.Regions;
using Microsoft.Practices.Composite.Events;

On va les remplacer dans tout le projet par :
using Microsoft.Practices.Prism.UnityExtensions;
using Microsoft.Practices.Prism.Modularity;
using Microsoft.Practices.Prism.Regions;
using Microsoft.Practices.Prism.Events;

Les "XML Name Space" xmlns: dans les fichiers .xaml

Je trouve que bien souvent c'est le plus dur et que malgré l'intellisence modifier les names spaces dans les fichiers xaml c'est toujours délicat.

Donc voici ce que j'ai fais :
Dans \\HappyNet v1.2 - SL5\HappyNet-SL5\ButtonStyles.xaml
Je remplace :
xmlns:Regions="clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation"
xmlns:cal="clr-namespace:Microsoft.Practices.Composite.Presentation.Commands;assembly=Microsoft.Practices.Composite.Presentation"
Par :
xmlns:Regions="clr-namespace:Microsoft.Practices.Prism.Regions;assembly=Microsoft.Practices.Prism"
xmlns:cal="clr-namespace:Microsoft.Practices.Prism.Commands;assembly=Microsoft.Practices.Prism"

Certains projets utilisent encore Silverlight 4.0

Dans le fichier :
\\HappyNet v1.2 - SL5 ref\HappyNet-SL5\Client\Core\Soat.HappyNet.Silverlight.DataContract\Soat.HappyNet.Silverlight.DataContract.csproj
On trouve :
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
Que l'on va remplacer par :
    <TargetFrameworkVersion>v5.0</TargetFrameworkVersion>

Lancer l'exécution du projet HappyNet v1.2

On arrive maintenant à compiler, on se dit que cela y est et on lance une exécution et bien sûr c'est la catastrophe ! Il reste deux ou trois petite chose avant de lancer une exécution ...

Configuration du serveur IIS

Il me semble que j'ai créé un répertoire virtuel ... ?
Propriétés du projet \\HappyNet v1.2 - SL5\HappyNet-SL5\Web\Soat.HappyNet.WebSite\Soat.HappyNet.WebSite
Il me semble bien avoir cliqué sur le bouton "Create Virtual Directory" ...

L'application Web qui Host le Silverlight ne charge pas le .xap

Encore une autre erreur : le site Web c'est à dire l'application web qui host le silverlight :
\\HappyNet v1.2 - SL5\HappyNet-SL5\Web\Soat.HappyNet.WebSite\ClientBinSoat.HappyNet.Silverlight.xap
N'est pas foutue de charger le .xap ...
Solution :
Démarrer->Tous les programmes->Outils d'administration->Gestionnaire des services Internet (IIS) :
Répertoire vituel host de l'application Silverlight : HappyNet
Bouton droit->Propiétés->Onglet : Sécurité des répertoires->Authentification et contrôle d'accès->Bouton Modifier :
Cochez la case Authentification Windows intégrée ...
Pensez à cocher la case ...

Soat.HappyNet.Silverlight.xap se charge dans l'internet explorer

Encore une erreur d'un autre monde cette à l'exécution de l'application Silverlight :

CommunicationException publier un fichier de stratégie
J'adore cette erreur de 14 km où l'on y parle de stratégie inadaptée aux services SOAP. Où il faudrait contacter le propriétaire du service pour autorise l'envoi d'en-tête HTTP-SOAP.

De quoi s'agit-il ? Avec Silverlight on aura pris l'habitude de découvrir le fameux fichier :
C:\Inetpub\wwwroot\clientaccesspolicy.xml

Et son contenu :

<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction">
<domain uri="*" />
</allow-from>
<grant-to>
 <resource path="/" include-subpaths="true" />
</grant-to>
</policy>
</cross-domain-access>
</access-policy>

Sans quoi rien ne fonctionne ...

Enfin la fenêtre principale de l'application apparaît

file:///E:/HappyNet%20v1.2%20-%20SL5/HappyNet-SL5/Client/Core/Soat.HappyNet.Silverlight/Bin/Debug/TestPage.html#home

Exécution en mode debug  de l'application Silverlight Hostée par une appilcation Web : HappyNet v1.2
Pour rire je clique sur l'onglet Boutique :

HappyNet v1.2 onglet Boutique
Au bout d'un certain temps ... :


Détail de cette Exception Générale :


Et oui ! Je n'ai pas encore installé la SQL Server DataBase AdventureWorks for SQL Server 2008 que l'on peut d'ailleurs trouver ici :

http://msftdbprodsamples.codeplex.com/releases/view/37109

Tout n'est pas encore gagné ...

Conclusion 

Trouvez-vous que Silverlight for Web c'est vraiment Happy ?

Maintenant que je suis rassuré par l'exécution de ce projet, je souhaite le découvrir plus avant le code source mais certaines choses m'étonnent ...

Et je le crois, m'étonneront toujours. Notamment tout le code source présent dans le projet Soat.HappyNet.Silverlight :
Par exemple :
\\HappyNet v1.2 - SL5\HappyNet-SL5\Client\Core\Soat.HappyNet.Silverlight.Library\Commands\DelegateCommand.cs

Ou bien dans :
E:\HappyNet v1.2 - SL5\HappyNet-SL5\Client\Core\Soat.HappyNet.Silverlight.Library\Behaviors\DataStateBehavior.cs

Avec son entête :
// (c) Copyright Microsoft Corporation.
// This source is subject to the Microsoft Permissive License.
// See http://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx.
// All other rights reserved.
// http://expressionblend.codeplex.com/

Mais son name space :
namespace Soat.HappyNet.Silverlight.Library.Behaviors

A t-on vraiment besoin de tout ce code pour faire fonctionner une simple application Silverlight ?

HappyNet v1.2 Silverlight with Prism Mais qu'est ce que c'est que tout ce code  ?
Pour aller plus loin jetez un oeil ici :
http://www.microsoft.com/en-us/sharedsource/default.aspx

Il semble bien que certaines choses et certains mystères de Silverlight soit réservés à ceux qui sont initiés ...