IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

comment redéfinir Membershipprovider [Débutant]


Sujet :

ASP.NET MVC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Points : 76
    Points
    76
    Par défaut comment redéfinir Membershipprovider
    Bonjour,

    Pour faire simple, j'aimerai sauver mes users dans ma propre db tout en gardant les composants de connexion qui ont été généré au moment où je fais un nouveau projet MVC 4.
    J'ai donc commencé par me faire une table User dans ma db
    Ensuite j'ai créé une class CustomMemberShip héritant de MembershipProvide.
    Jusque là rien de sorcier
    Ensuite j'ai rajouté ceci dans le web.config
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <membership defaultProvider="CustomMemberProvider" userIsOnlineTimeWindow="15">
          <providers>
            <clear/>
            <add name="CustomMemberProvider" type="test.DAL.Connection.CustomMemberProvider" />
          </providers>
    </membership>
    Le problème maintenant c'est que lorsque je lance l'appli, je me retrouve avec l'erreur en pièce jointe.
    J'imagine qu'il faut spécifier au controller "AccountController" d'utiliser ma class mais je suis un peu perdu.

    Merci de votre aide
    Images attachées Images attachées  

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Est-ce que tu l'as bien mis dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <system.web></system.web>
    dans ton web.config ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Points : 76
    Points
    76
    Par défaut
    Effectivement ce n'était pas dans System.web
    Par contre voici l'erreur maintenant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     Erreur de configuration
    Description : Une erreur s'est produite lors du traitement d'un fichier de configuration requis pour répondre à cette demande. Veuillez consulter ci-dessous les détails relatifs à l'erreur en question, puis modifier votre fichier de configuration de manière appropriée.
     
    Message d'erreur de l'analyseur: Cette méthode ne peut pas être appelée lors de la phase d'initialisation de pré-démarrage de l'application.
     
    Erreur source:
     
     
    Ligne 34 :       <providers>
    Ligne 35 :         <clear/>
    Ligne 36 :         <add name="CustomMemberProvider" type="erp.DAL.Connection.CustomMemberProvider" />
    Ligne 37 :       </providers>
    Ligne 38 : </membership>
     
     
    Fichier source : E:\developpement vs\erp\erp\web.config    Ligne : 36
    Pour info voici mon web.config

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    <?xml version="1.0" encoding="utf-8"?>
    <!--
      Pour plus d’informations sur la configuration de votre application ASP.NET, consultez la page
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      </configSections>
      <connectionStrings>
        <!--<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-erp-20130511145954;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-erp-20130511145954.mdf" providerName="System.Data.SqlClient" />-->
        <add name="ErpContext" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\erp.mdf;Integrated Security=True" providerName="System.Data.SqlClient"  />
     
      </connectionStrings>
     
     
     
      <appSettings>
        <add key="webpages:Version" value="2.0.0.0" />
        <add key="webpages:Enabled" value="false" />
        <add key="PreserveLoginUrl" value="true" />
        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
      </appSettings>
      <system.web>
     
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
        <!--<authentication mode="Forms">
          <forms loginUrl="~/Account/Login" timeout="2880" />
        </authentication>-->
        <membership defaultProvider="CustomMemberProvider" userIsOnlineTimeWindow="15">
          <providers>
            <clear/>
            <add name="CustomMemberProvider" type="erp.DAL.Connection.CustomMemberProvider" />
          </providers>
    </membership>
        <pages>
          <namespaces>
            <add namespace="System.Web.Helpers" />
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Optimization" />
            <add namespace="System.Web.Routing" />
            <add namespace="System.Web.WebPages" />
          </namespaces>
        </pages>
      </system.web>
      <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <handlers>
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
      </system.webServer>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="v11.0" />
          </parameters>
        </defaultConnectionFactory>
      </entityFramework>
    </configuration>
    Merci de votre aide

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Voici la partie system.web de mon fichier web.config si tu veux comparer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     <system.web>
        <httpRuntime requestValidationMode="2.0" enableVersionHeader="false" useFullyQualifiedRedirectUrl="true" maxRequestLength="16384" executionTimeout="3600" requestLengthDiskThreshold="16384" />
        <globalization culture="fr-FR" uiCulture="fr" requestEncoding="UTF-8" responseEncoding="UTF-8" fileEncoding="UTF-8" />
        <!--<globalization culture="en-US" uiCulture="en"  fileEncoding="iso-8859-1" requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/>-->
        <authentication mode="Forms">
          <forms name=".YAFNET_Authentication" protection="All" timeout="43200" cookieless="UseCookies" />
        </authentication>
        <customErrors mode="RemoteOnly" defaultRedirect="~/Erreur.htm" />
        <!-- Set debug to "true" to test out the system in development -->
        <compilation debug="true" targetFramework="4.0">
          <assemblies>
            <add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=*" />
            <add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=*" />
            <add assembly="System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=*" />
            <add assembly="System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=*" />
            <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=*" />
            <add assembly="System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=*" />
            <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=*" />
            <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=*" />
            <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=*" />
          </assemblies>
        </compilation>
        <httpHandlers>
          <add verb="GET" path="Resource.ashx" type="YAF.YafResourceHandler, YAF" />
        </httpHandlers>
        <httpModules>
          <add name="YafTaskModule" type="YAF.Core.YafTaskModule, YAF.Core" />
          <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule,Intelligencia.UrlRewriter" />
        </httpModules>
        <pages theme="ThemePrincipal" maintainScrollPositionOnPostBack="true" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" enableEventValidation="false" validateRequest="false">
          <controls>
            <!-- Default: use non-dynamic (compiled classes) in YAF -->
            <add tagPrefix="YAF" namespace="YAF.Controls" assembly="YAF.Controls" />
            <add tagPrefix="YAF" namespace="YAF.Controls.Statistics" assembly="YAF.Controls" />
            <add tagPrefix="YAF" namespace="YAF.Classes" />
            <add tagPrefix="YAF" namespace="YAF" />
            <add tagPrefix="ajaxToolkit" assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" />
          </controls>
          <namespaces>
            <add namespace="YAF.Core" />
            <add namespace="YAF.Controls" />
            <add namespace="YAF.Utils" />
            <add namespace="YAF.Types.Interfaces" />
            <add namespace="YAF.Types" />
          </namespaces>
        </pages>
        <membership defaultProvider="YafMembershipProvider" hashAlgorithmType="SHA1">
          <providers>
            <clear />
            <!-- YAF's ASP.NET Membership Provider is designed to work a bit better with YAF.NET options, but is by no means required.
                 But, you will not be able to switch providers after installing your forum. -->
            <add name="YafMembershipProvider" applicationName="YetAnotherForum" connectionStringName="LocalSqlServer" requiresUniqueEmail="true" useSalt="true" type="YAF.Providers.Membership.YafMembershipProvider" />
            <!-- Set as default if you want to use use the built-in ASP.NET membership provider. Password Type of "Encrypted" requires a machine key. -->
            <add name="AspNetSqlMembershipProvider" applicationName="YetAnotherForum" connectionStringName="LocalSqlServer" enablePasswordReset="false" enablePasswordRetrieval="true" maxInvalidPasswordAttempts="5" minRequiredNonalphanumericCharacters="0" minRequiredPasswordLength="5" passwordAttemptWindow="15" passwordFormat="Encrypted" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" type="System.Web.Security.SqlMembershipProvider" />
          </providers>
        </membership>
        <roleManager enabled="true" defaultProvider="YafRoleProvider">
          <providers>
            <clear />
            <!-- YAF's ASP.NET Role Provider is designed to work a bit better with YAF.NET options, but is by no means required.
                 But, you will not be able to switch providers after installing your forum. -->
            <add name="YafRoleProvider" applicationName="YetAnotherForum" connectionStringName="LocalSqlServer" type="YAF.Providers.Roles.YafRoleProvider" />
            <!-- Set as default if you want to use use the built-in ASP.NET role provider. -->
            <add name="AspNetSqlRoleProvider" applicationName="YetAnotherForum" connectionStringName="LocalSqlServer" type="System.Web.Security.SqlRoleProvider" />
          </providers>
        </roleManager>
        <profile enabled="true" defaultProvider="YafProfileProvider" inherits="YAF.Utils.YafUserProfile">
          <providers>
            <clear />
            <!-- YAF's ASP.NET Profile Provider is designed to work a bit better with YAF.NET options, but is by no means required.
                 But, you will not be able to switch providers after installing your forum. -->
            <add name="YafProfileProvider" applicationName="YetAnotherForum" connectionStringName="LocalSqlServer" type="YAF.Providers.Profile.YafProfileProvider" />
            <!-- Set as default if you want to use use the built-in ASP.NET profile provider. -->
            <add name="AspNetSqlProfileProvider" applicationName="YetAnotherForum" connectionStringName="LocalSqlServer" type="System.Web.Profile.SqlProfileProvider" />
          </providers>
        </profile>
        <!--  Enable it if your application is hosted in a web farm or cluster (e.g. GoDaddy hosting) or you are using standard ASP.NET providers and encryption. 
              IMPORTANT: DO NOT USE THIS KEY! You need to generate your own machine key (google it).
        -->
        <machineKey validationKey="*" decryptionKey="*" validation="SHA1" decryption="AES" />
      </system.web>

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Points : 76
    Points
    76
    Par défaut
    Une fois mon membershipprovider extend, est ce que je dois regénérer un controller et toutes les vues (change password, edit, ajout, recup password, ...) ou alors je peux garder ce qui est par défaut?
    Vous n'auriez pas un bon tuto à suivre pour MVC 4?

    merci

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Il semble que l'erreur soit plutot au niveau du provider dans le web.config que dans ton code (peut être devrais-tu spécifier la connectionStringName et les autres propriétés ou peut être que ton type erp.DAL.Connection.CustomMemberProvider n'est pas visible ou incorrect).
    Sinon je ne connais pas grand chose à ASP.Net MVC, je fais de l'asp.net classique mais dans le cas de l'asp.net classique tu peux continuer à utiliser les mêmes composants pour la gestion des utilisateurs même si on change de membership provider.

    Ici tu as des tutos pour Asp MVC :http://dotnet.developpez.com/mvc/

    et ici pour le membership:
    http://ditch.developpez.com/aspnet2/membershipprovider/

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Points : 76
    Points
    76
    Par défaut
    J'ai avancé dans mon soucis. maintenant l'app se lance correctement.
    Dans web.config j'ai rajouté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <appSettings>
        <add key="enableSimpleMembership" value="false"/>
    </appSettings>
    Le problème est que lorsque je veux aller sur le lien s'inscrire, qui utilise le controller "AccountController" généré automatiquement.

    Je me retrouve avec une exception "targetInvocationException" lancée dans : InitializeSimpleMembershipAttribute

    Pourquoi ceci "[InitializeSimpleMembership]" dans AccountController?
    Dois-je alors générer mon propre controller?

    merci de votre aide

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Points : 76
    Points
    76
    Par défaut
    Je reviens vers vous car j'ai voulu redéfinir extendedMembershipProvider vu que c'est cette dernière qui est héritée pour simpleMembership.
    Le problème est que lorsque je veux overrider createUserAndAccount, je dois faire avec la signature string,string, bool, IDictionary<string,Object>

    Tandis que dans AccountController, je dois appeler la méthode avec : string,string, IDictionary<string,Object>, bool

    Si je décide d'overrider la méthode avec la signature ci dessous, il rentre quand même dans l'autre

    Ou alors je refais toute l'authentification avec les composants connexion offerts

    Merci de votre aide pcq ça me rend chèvre

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 76
    Points : 143
    Points
    143
    Par défaut
    En fait, le contrôleur AccountController utilise un SimpleMembership.

    [InitializeSimpleMembership] dans AccountController sert à initialiser le SimpleMembeship.

    Tu pourra retrouver le code de cet attribut dans le fichier "InitializeSimpleMembershipAttribute.cs" contenu dans le dossier "Filter".

    Si tu as besoin d'intégrer la table User à ton application, il n'y a rien de compliquer.

    Les seuls pré-requis est que ta table user est une clé primaire de type "Identity" et un champs de type nvarchar qui correspond au login.

    Tu as une ligne intéressante dans le fichier "InitializeSimpleMembershipAttribute.cs", c'est celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
    un petite description des paramètres :
    1. chaine de connexion à utiliser
    2. Nom de la table contenant les utilisateurs
    3. Nom du champs Identity
    4. Nom du champ correspondant au login
    5. création automatique des tables manquantes


    Si tu es des informations complémentaires sur tes utilisateurs, il faudra faire quelque modifications des vue et du contrôleur pour gérer ces informations supplémentaires.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Points : 76
    Points
    76
    Par défaut
    Je comprends bien mais j'ai donc hérité la classe "ExtendedMembershipProvider" et j'ai donc la méthode:
    public override string CreateUserAndAccount(string userName, string password, bool requireConfirmation, IDictionary<string, object> values)

    et dans mon controller si je tente de passer ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dictionary<string, Object> dictionary = new Dictionary<string, Object>();
                        User u = new User { login = model.login, password = model.password, isAdmin = false, isValide = false, lastName = model.lastName, firstName = model.firstName, zipcode = model.zipcode, city = model.city, phone = model.phone, fax = model.fax, gsm = model.gsm, profilID = 2 };
                        dictionary.Add("1", u);
     
                        WebSecurity.CreateUserAndAccount(model.login.ToString(), model.password.ToString(), dictionary, true);
                        WebSecurity.Login(model.login, model.password);
                        return RedirectToAction("Index", "Home");
    Comme vous pouvez le voir les paramètres IDictionnary et bool sont inversés par rapport à la méthode héritée.
    Si j'inverse les paramètres dans la méthode héritée, il ne passe quand meme pas dedans mais bien dans celle par défaut.

    Je désespère un peu de trouver

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Points : 76
    Points
    76
    Par défaut
    J'ai testé de modifié la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Threading;
    using System.Web.Mvc;
    using WebMatrix.WebData;
    using erp.Models;
     
    namespace erp.Filters
    {
        [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
        public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
        {
            private static SimpleMembershipInitializer _initializer;
            private static object _initializerLock = new object();
            private static bool _isInitialized;
     
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                // Ensure ASP.NET Simple Membership is initialized only once per app start
                LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
            }
     
            private class SimpleMembershipInitializer
            {
                public SimpleMembershipInitializer()
                {
                    Database.SetInitializer<UsersContext>(null);
     
                    try
                    {
    //j'ai également modifié ici pour utiliser mon context
                        using (var context = new ErpContext())
                        {
                            if (!context.Database.Exists())
                            {
                                // Create the SimpleMembership database without Entity Framework migration schema
                                ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                            }
                        }
    //voilà la ligne que j'ai modifiée
                        WebSecurity.InitializeDatabaseConnection("ErpContext", "User", "personID", "login", autoCreateTables: false);
                    }
                    catch (Exception ex)
                    {
                        throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
                    }
                }
            }
        }
    }
    Voici ma classe ErpContext
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity.ModelConfiguration.Conventions;
    using System.Data.Entity;
     
     
    namespace erp.Models
    {
        public class ErpContext : DbContext
        {
            public DbSet<Person> Persons { get; set; }
            public DbSet<User> Users { get; set; }
            public DbSet<Profil> Profils { get; set; }
     
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
                //Database.SetInitializer<Erp>(new ErpContextInitializer());
            }
     
        }
    }
    LE problème est que j'ai une exception "TagetIvocationException" levée au niveau de: InitializeSimpleMembershipAttribute dans la fonction "OnActionExecuting"

    MErci de votre aide

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2013
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 39
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par bender86 Voir le message
    Bonjour,
    Pour faire simple, j'aimerai sauver mes users dans ma propre db tout en gardant les composants de connexion qui ont été généré au moment où je fais un nouveau projet MVC 4.
    Je ne me souviens pas exactement ce ce qui est généré, mais si tu veux avoir ta propre base de données pour ce qui concerne tes utilisateurs, il faut utiliser SimpleMembership Provider QUI N'EST PAS COMPATIBLE avec le ASP "classique" et notamment l'option ASP.NET configuration du menu projets.

    La bonne nouvelle, c'est qu'il n'y a absolument AUCUN besoin de dériver et d'écrire soi-même un nouveau provider.

    Voici les points clefs de mon web.config, et autres classes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <add key="enableSimpleMembership" value="true" />
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <roleManager enabled="true" defaultProvider="simple">
          <providers>
            <clear />
            <add name="simple" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
          </providers>
        </roleManager>
        <membership defaultProvider="simple">
          <providers>
            <clear />
            <add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
          </providers>
        </membership>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <system.data>
        <DbProviderFactories>
          <remove invariant="System.Data.SqlServerCe.4.0" />
          <add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory,                   System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
        </DbProviderFactories>
      </system.data>
    Comme tu peux le voir, j'utilise ici SQLServer Compact 4.0. ce pourrait être n'importe quelle autre base (où à peu près, y compris MySQL).

    Dans le répertoire Filters de l'application, voici la classe InitializeFilterAttributes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
        public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
        {
            private static SimpleMembershipInitializer _initializer;
            private static object _initializerLock = new object();
            private static bool _isInitialized;
     
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                // Ensure ASP.NET Simple Membership is initialized only once per app start
                LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
            }
     
            private class SimpleMembershipInitializer
            {
                public SimpleMembershipInitializer()
                {
                    Database.SetInitializer<UsersContext>(null);
     
                    try
                    {
                        using (var context = new UsersContext())
                        {
                            if (!context.Database.Exists())
                            {
                                // Create the SimpleMembership database without Entity Framework migration schema
                                ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                            }
                        }
     
                        WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);                   
                    }
                    catch (Exception ex)
                    {
                        throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
                    }
                }
            }
        }
    Au fait, j'ai oublié la nécessaire présence d'EntityFramework et de ses paramètres dans Web.Config:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="System.Data.SqlServerCe.4.0" />
          </parameters>
        </defaultConnectionFactory>
      </entityFramework>
    J'espère que cela peut t'aider à te mettre sur la bonne piste. N'hésite pas pour d'autres questions.

    Bernard

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Points : 76
    Points
    76
    Par défaut
    Voilà je reviens pour partager ma solution.
    J'ai commencé par ajouter dans global.asax
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WebSecurity.InitializeDatabaseConnection("madb.mdf", "UserProfile", "monIdUser", "monLoginUser", autoCreateTables: true);
    J'ai ensuite supprimer le fichier: InitializeSimpleMembershipAttribute.cs

    Ensuite dans AccountModel.cs, j'ai supprimé la class UsersContext héritant de DbContext ainsi que la class UserProfile. Ensuite, j'ai redéfini la class "Register" pour utiliser les champs que je voulais ajouter.
    Toujours dans AccountController, j'ai modifié cette ligne pour qu'il sauve tous les champs que j'ai ajouté dans ma class User
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WebSecurity.CreateUserAndAccount(model.login.ToString(), model.password.ToString(), new { login = model.login, password = model.password, isAdmin = false, isValide = false, lastName = model.lastName, firstName = model.firstName, zipcode = model.zipcode, city = model.city, phone = model.phone, fax = model.fax, gsm = model.gsm, profilID = 2 });
    Dans le dossier views/account, j'ai adapté register.html pour qu'il corresponde à ma class User

    Voilà merci à ceux qui m'ont aidé à comprendre.
    Je conseille également les vidéos sur le site: http://www.asp.net/mvc
    qui m'ont bien aidé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/08/2010, 10h15
  2. Réponses: 0
    Dernier message: 26/11/2007, 15h47
  3. Comment redéfinir la couleur du texte d'un input
    Par mateuil dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 27/06/2007, 03h01
  4. Comment redéfinir les raccourcis claviers eclipse ?
    Par Robiwan59 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 04/05/2007, 10h04
  5. [C#] Comment redéfinir GetHashCode() ?
    Par pornik dans le forum C#
    Réponses: 8
    Dernier message: 06/04/2006, 19h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo