WCF Services et Authentification

Comment gérer l'authentification dans les WCF Services ?

Au delà de la gestion de l'authentification dans une application web (ASP.NET), il faut bien un mécanisme pour gérer l'authentification dans les Services WCF (ou services web). Un mécanisme qui permette à mon WCF Service de dire si l'application cliente qui tente d'accéder au Service est autorisée à le faire ou non. 

Qu'est ce qu'il existe sur ce sujet dans le .NET ?

Exemples de code source 

Il existe quelques exemples de code, on se dirigera d'abord vers MSDN de Microsoft :

How to: Specify Client Credentials for a Data Service Request (WCF Data Services)
By default, the client library does not supply credentials when sending a request to an OData service. However, you can specify that credentials be sent to authenticate requests to the data service by supplying a NetworkCredential for the Credentials property of the DataServiceContext.

http://msdn.microsoft.com/en-us/library/gg258445(v=vs.110).aspx

Un peu complexe, non ?

Au début il y avait  :

Authentication and Authorization in WCF Services - Part 1
http://msdn.microsoft.com/library/ff405740.aspx

Prise en main des outils WCF Services

Pour utiliser correctement ces exemples, il faut prendre en main les outils : Client Test WCF et l'éditeur de configuration WCF.

Dans Visual Studio 2013 :

Editeur de configuration des services WCF
On y accède également par clique droit sur le fichier App.config :

Configuration des Services WCF
Si vous configurez correctement vos services WCF au lancement de l'application vous aurez "Client Test WCF" qui se lancera :

Au démarrage de l'application web lancement de Client Tests WCF
Voilà la prise en main est assez complexe, vous devrez également supprimer et refaire les références de services, c'est le petit jeu habituel. Le code gérer issu de projets déjà existant ne fonctionne bien évidemment pas sur votre machine il faut donc supprimer et recommencer.

Autres exemples d'authentification dans les WCF Services

On trouve également dans le CodeProject :

Custom Authorization in WCF

http://www.codeproject.com/Articles/33872/Custom-Authorization-in-WCF

WF_WCF_Samples

Le must have d'MSDN !
http://www.microsoft.com/en-us/download/confirmation.aspx?id=21459

Je me demande bien pourquoi ils sont mélangés les exemples WCF et WF (Workflow Foundation) !?

On finira par écrire le code suivant :

private void logInButton_Click(object sender, EventArgs e)
{
  proxy = new SecureServiceClient("WSHttpBinding_ISecureService");

  proxy.ClientCredentials.UserName.UserName = nameTextBox.Text;
  proxy.ClientCredentials.UserName.Password = passwordTextBox.Text;
}

Bref tout ceci ne fonctionne pas très bien à croire qu'il y a peut d'intérêt à authentification les application.net dans les WCF Sercices ou bien une autre hypothèse : c'est très complexe à mettre en oeuvre.

Il faut tout simplement mettre en oeuvre une communication simple par double clef de cryptage et donc il n'y a pas de mécanisme autre que Crypto à utiliser.

WCF Services avec un jeton d'encryptage customisé

Une autre piste à parcourir, c'est en anglais et c'est Ici.

Mais on est pas loin d'une mécanisme spécifique ... Spécifier l'authentification dans les WCF Services ce serait par exemple l'échange d'un message avec un contenu qui pourrait déterminer si l'application cliente est authorisée à accéder aux WCF Services.

Visual Studio Online

Création d'un compte Visual Studio Online

Lors de la création de votre compte d'utilisateur Visual Studio Online, on vous demandera de créer une url de la forme  : xxx.visualstudio.com pour accéder à votre compte.


Création du compte Visual Studio Online effectué
Création du compte Visual Studio Online effectué : https://braby.visualstudio.com/
Une fois la création du compte Visual Studio Online effectuée : https://xxx.visualstudio.com/ il faut choisir un Gestionnaire de Version.

Git est un gestionnaire de version décentralisé créé par Linus Torvalds le créateur de Linux il peut être utilisé avec Visual Studio.

Visual Studio Online, de toutes les façons nous n'avons plus le choix il faut créer un compte outlook.com pour avoir accès à Visual Studio, autant profiter des avantages gratuits de VS Online ...

l'url de votre Visual Studio Online vous servira de Team Foundation Server dans Visual Studio.

Mise à jour en 2018 : Visual Studio Online est devenu VSTS (Visual Studio Team foundation Server) qui lui même est devenu Azure DevOps

Visual Studio Online, Team Foundation Server, Azure

Avec Visual Studio 2013, on va pouvoir découvrir un nouveau mode de développement d'applications, un mode de développement directement dans le cloud (la plate forme Azure), un mode de développement réellement collaboratif, en équipe.

Tout commence à l'adresse suivante avec Visual Studio Online :

www.visualstudio.com


Visual Studio Online pour le grand public
Visual Studio Online pour le grand public
Puis vous cliquez sur le bouton "Version d'évaluation gratuite".
Si vous n'avez pas de compte vous devrez en créer un :
Visual Studio Online - Se  connecter
Visual Studio Online - Se  connecter

Une fois votre compte Microsoft créé, vous pouvez créer un compte Visual Studio Online :


Visual Studio Online - Créer un compte
Visual Studio Online - Créer un compte
Pour l'instant la suite se trouve en Anglais page suivante sur Channel 9, nous irons plus loin la prochaine fois.

http://channel9.msdn.com/Events/Build/2014/2-575

Have fun!

ASP.NET MVC 4 CRUD With Entiry Framework 5.0

Comment faire un CRUD (Create Read Update Delete) avec ASP.NET MVC 4 et Entity Framework EF 5.x sous Visual Studio 2010 ?

Depuis l'avènement des NuGet packages et des autre tools qui entourent Visual Studio, sans lesquels il n'est pas possible de faire quoi que se soit, je trouve que le développement ASP.NET tient de la magie. Comme je n'ai pas froid au yeux et que je suis un peu magicien moi même, à mes heures perdues, je me lance.

J'ai trouvé ceci : ASP.NET MVC 4 – CRUD operations Entity Framework (8 steps to create your site).

Mais moi, je voudrais utiliser :

Visual Studio 2010, avec ASP.NET MVC 4, ADO Entity Framework 5.x et NuGet pour faire un CRUD (create/read/update/delete) de données structurées dans une BD SqlServer.

Est-ce que c'est possible ?

Installation de la plateforme de développement

Tout passe par la gestion des extensions et la configuration des Packages NuGet :

Gestion des Extensions
Il me faut installer deux choses :

Extensions installées par NuGet
NuGet Package Management et EF 5.x DBContext Generator for C# sont les deux extensions nécessaires à la réalisation de mon CRUD.

EF 5.x DBContext Generator for C# va me permettre de créer le modèle de données que j'utiliserai dans mon application ASP.NET MVC4.

Création de ma nouvelle Application MVC4

Après avoir installé le package MVC4 pour Visual Studio que j'ai téléchargé Ici.
Il ne me reste plus qu'à créer mon premier projet : 

Création d'une application ASP.NET MVC 4 avec Visual Studio
La structure du projet est la suivante :
Structure d'un projet ASP.NET MVC4
C'est déjà un projet assez conséquent avec déjà quelques formulaires concernant la création et la gestion des contacts et des utilisateurs de l'application ainsi que leur authentification.

Création du modèle Entity et de la base de donnée SqlServer

Il manque cruellement une base de données que je vais créer avec Entity Framework :
Création du modèle Entity Framework
Dans l'éditeur de modèle, je créé trois Entity (trois tables ou trois objets c'est la même chose) de la façon suivante :
Mon Model1.edmx
Je créé ma base de données SqlServer :

Création de la base SqlServer DataBase1.mdf
Puis je génère le script de création de la base dans l'éditeur de modèle Entity :

Génération du script de création de la base à partir du modèle
Jusque là tout va bien.

Installation de MvcScaffolding package Nuget

Je dois utiliser mvcscaffolding pour créer les objets (contrôlers) que je pourrai utiliser dans mon application ASP.NET MVC c'est là que je trouve que les choses sont un peu magiques !

Il faut taper la commande :

PM> install-package mvcscaffolding
dans la console de management des packets qui se trouvent ici :

Afficher la console PM (Package Management)

Exécution de la commande :

PM> install-package mvcscaffolding
Tentative de résolution de la dépendance « T4Scaffolding ».
Tentative de résolution de la dépendance « T4Scaffolding.Core ».
Tentative de résolution de la dépendance « EntityFramework ».
Installation de « T4Scaffolding.Core 1.0.0 » terminée.
Vous téléchargez EntityFramework à partir de Microsoft. Le contrat de licence est disponible à l’emplacement http://go.microsoft.com/fwlink/?LinkID=320539. Vérifiez si le package contient des dépendances susceptibles de faire l’objet de contrats de licence supplémentaires. Votre utilisation du package et des dépendances confirment votre acceptation de leurs contrats de licence. Si vous n’acceptez pas les contrats de licence, supprimez les composants correspondants de votre ordinateur.
Installation de « EntityFramework 6.1.0 » terminée.
Installation de « T4Scaffolding 1.0.8 » terminée.
Installation de « MvcScaffolding 1.0.9 » terminée.
Ajout réussi de « T4Scaffolding.Core 1.0.0 » à MvcApplication2.
« EntityFramework 5.0.0 » a été supprimé avec succès de MvcApplication2.
Ajout réussi de « EntityFramework 6.1.0 » à MvcApplication2.

Type 'get-help EntityFramework' to see all available Entity Framework commands.
Ajout réussi de « T4Scaffolding 1.0.8 » à MvcApplication2.
Ajout réussi de « MvcScaffolding 1.0.9 » à MvcApplication2.
Désinstallation de « EntityFramework 5.0.0 » terminée.

Utilisation du package MvcScaffolding

Mon package étant installé, je peux maintenant l'utiliser :
J'ai créé trois Entity : Compagny, Region, Departement, je vais donc lancer trois commande :

PM> scaffold controller CompagnyController –force –DBContextType “ModelContainer”
Scaffolding CompagnyController...
Added database context 'Models\ModelContainer.cs'
Added 'Compagny' to database context 'MvcApplication2.Models.ModelContainer'
Get-PrimaryKey : Error HRESULT E_FAIL has been returned from a call to a COM component.
At E:\Templates\MvcApplication2\packages\MvcScaffolding.1.0.9\tools\Controller\MvcScaffolding.Controller.ps1:71 char:29
+ $primaryKey = Get-PrimaryKey <<<<  $foundModelType.FullName -Project $Project -ErrorIfNotFound
    + CategoryInfo          : NotSpecified: (:) [Get-PrimaryKey], COMException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.GetPrimaryKeyCmdlet

Error du package MvcScaffolding

Et là c'est la drame :

Error du package MvcScaffolding

Solution du package MvcScaffolding

Comment faire pour se sortir de ce très mauvais pas ! Voici ce que j'ai fais, c'est issu une longue longue expérience des outils et des problèmes Microsoft.

Créer le modèle EDMX au bon endroit

Je recréé le modèle .edmx dans le répertoire modèle afin que les objets générés aient le "bon namespace" car je pense que MvcScaffolding est typiquement le genre d'outil à se planter sinon ... 

Le Modèle Entity dans le répertoire Models ...
Je supprime l'ancien modèle et je créé le nouveau à partir de la BD ça fonctionne.

Modifier la génération pour obtenir des DbContext

En suite, on voit que Scaffold souhaite des objets de type DbContext c'est plus moderne. Je vais donc bouton-droit dans l'éditeur de modèle Entity pour faire :

Modèle Entity ajout d'une génération spécifique
Et je choisi :

Choix du EF DbContext Generator
Dans le fichier :
\\Templates\MvcApplication2\MvcApplication2\Models\Model1.Context.cs

public partial class DataBase1Entities : DbContext

DataDataBase1Entities ne dérive plus de ObjectContext mais de DbContext

Relancer la commande Scaffold

Comme j'ai créé la base à partir du modèle Entity mon objet Compagny s'appelle CompagnySet je lance donc la commande :
PM> scaffold controller CompagnySetController –force –DBContextType “ModelContainer”
Scaffolding CompagnySetController...
Added database context 'Models\ModelContainer.cs'
Added 'CompagnySet' to database context 'MvcApplication2.Models.ModelContainer'
Added controller Controllers\CompagnySetController.cs
Added Create view at 'Views\CompagnySet\Create.cshtml'
Added Edit view at 'Views\CompagnySet\Edit.cshtml'
Added Delete view at 'Views\CompagnySet\Delete.cshtml'
Added Details view at 'Views\CompagnySet\Details.cshtml'
Added Index view at 'Views\CompagnySet\Index.cshtml'
Added _CreateOrEdit view at 'Views\CompagnySet\_CreateOrEdit.cshtml'

Cette fois ça fonctionne et mes objets ont été correctement créés :

CRUD complet sur l'objet Compagny Créé par Entity et Scaffold
A l'exécution, j'obtiens bien la possibilité de créer affin en liste mes Compagny :

Créer une nouvelle Compagny
Formulaire de création
Liste des Compagny
Et ne trouvez-vous pas cela magique ?

Encore quelques astuces en Silverlight 5.1.30140

Outil de configuration de Silverlight 5.1

J'ai trouvé un .exe dans le répertoire :
C:\Program Files\Microsoft Silverlight\5.1.30214.0\Silverlight.Configuration.exe
En double cliquant dessus :


Outil de configuration de Silverlight
Je peux configurer un certain nombre de petites chose comme : "Choisir les périphériques de capture de Silverlight" :

Configuration des périphériques de capture de Silverlight
 Et sur le dernier onglet :

Silverlight - Stockage d'application 

Curieux cet espace de stockage qui pointe chez Microsoft.

Qu'est ce que le sllauncher.exe ?

Toutes les explications sont Ici.

Mais c'est en anglais donc pour résumer, il s'agit d'un installeur d'application Silverlight ou .xap sur votre poste de travail ainsi vous pourrez vous passer du browser internet. Cette fonctionnalité est accessible depuis Silverlight 4.

SLLauncher.exe est donc un installeur d'application Silverlight que l'on dit "Out-of browser" ainsi l'application n'a plus besoin du Navigateur Internet pour fonctionner.


C'est quoi une Application ASP.NET MVC ?

Vous souhaitez effectuer vos premiers pas en créant votre première application ASP.NET MVC avec Visual Studio ? C'est le bon article. Une fois les outils MVC installés, utiliser l'admin tool pour configurer un utilisateur Admin et la base de données ASPNETDB.MDF est crée automatiquement, on peut alors commencer l'exploration de modèle et de l'application crée par ce modèle.

Un Template d'Application MVC 4 possède la structure suivante :

ASP.NET MVC 4 : Template
Deux projets, l'Application Web et un projet de Test :

ASP.NET MVC 4 : Template Test
L'Application Web ASP.NET MVC est constituée de Models, Views et de Controllers.

View

Navigation depuis la vue : 

@Html.ActionLink("Home", "Index", "Home")

System.Web.Mvc.Html.LinkExtensions
        // Summary:
        //     Returns an anchor element (a element) that contains the virtual path of the
        //     specified action.
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //   linkText:
        //     The inner text of the anchor element.
        //   actionName:
        //     The name of the action.
        //   controllerName:
        //     The name of the controller.
        // Returns:
        //     An anchor element (a element).
        //
        // Exceptions:
        //   System.ArgumentException:
        //     The linkText parameter is null or empty.
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName);

Controllers

namespace MvcApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
            return View();
        }

public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer
{
   ...

namespace System.Web.Mvc
{
    public abstract class ActionResult

ViewBag : Objet du controleur de base : dynamic data dictionnary
namespace System.Web.Mvc
{
     public abstract class ControllerBase : IController
    {
         public dynamic ViewBag { get; }

To Be Continued