2009-06-22 3 views
6

Nous utilisons des fournisseurs d'appartenance ASP.Net (le fournisseur SQL Server), et je veux être en mesure de créer un compte utilisateur Admin dans le cadre de notre programme d'installation. Pour ce faire, j'ai besoin que le fournisseur d'adhésion ASP.Net soit configuré pour que mon installateur puisse l'utiliser - mais je ne veux pas avoir à configurer un fichier de configuration pour le programme d'installation.Comment puis-je configurer les fournisseurs d'appartenance ASP.Net à l'aide du code?

Y a-t-il un moyen de configurer un abonnement ASP.Net à l'aide du code sans écrire de fournisseur personnalisé?

Répondre

7

Ok, après la solution qu'ils évoquaient ici: http://forums.asp.net/p/997608/2209437.aspx

J'ai créé une classe qui, dans le constructeur parameterless (dont vous avez besoin) obtient simplement le serveur et le port à partir des arguments de la ligne de commande. Un tel que je peux aller « MembershipInitializer.exe "SomeSqlServer \ instance" 51000.

public class CustomSQLMembershipProvider : SqlMembershipProvider { 
    private readonly string _server; 
    private readonly string _port; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="T:System.Web.Security.SqlMembershipProvider"/> class. 
    /// </summary> 
    public CustomSQLMembershipProvider() { 
    string[] args = System.Environment.GetCommandLineArgs(); 
    // args[0] is the exe name 
    _server = args[1]; 
    _port = args[2]; 
    } 

    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
    { 
    base.Initialize(name, config); 

    // Update the private connection string field in the base class. 
    string connectionString = string.Format(@"Data Source={0},{1};Initial Catalog=aspnetdb;UID=NICCAMembership;PWD=_Password1;Application Name=NICCA;Connect Timeout=120;", _server, _port); 

    // Set private property of Membership provider. 
    FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic); 
    connectionStringField.SetValue(this, connectionString); 
    } 
} 

Dans le app.config de votre application de la console (ou application windows)

<configuration> 
<connectionStrings> 
    <clear/> 
    <add name="MembershipDB" 
    connectionString="Some Bogus String here that gets overrided in the custom class" 
    providerName="System.Data.SqlClient"/> 
</connectionStrings> 
<system.web> 
    <authentication mode="Forms"/> 
    <authorization> 
    <deny users="?"/> 
    </authorization> 
    <membership> 
    <providers> 
    <remove name="AspNetSqlMembershipProvider"/> 
    <add name="AspNetSqlMembershipProvider" 
     connectionStringName="MembershipDB" 
     applicationName="NICCA" 
     type="MyInitializeMembershipDB.CustomSQLMembershipProvider, MyInitializeMembershipDB" 
     requiresUniqueEmail="false" 
     requiresQuestionAndAnswer="false"/> 
    </providers> 
    </membership> 
</system.web> 
</configuration> 

Si vous avez besoin de Si vous créez un programme pour initialiser automatiquement votre base de données d'adhésion à un état spécifique, mais l'adresse du serveur sql et le nom du port ne sont pas forcément les mêmes que ceux du fournisseur de rôle, vous devrez probablement redéfinir SqlRoleProvider de la même manière. t connu jusqu'à ce que quelqu'un entre dans un dans assistant de décrochage, cela fera l'affaire ..

Est-ce que cela aide?

+0

C'est à peu près ce que je suis arrivé à la fin. Il est dommage que nous soyons obligés d'utiliser la réflexion pour définir des membres privés afin que cela fonctionne :-(. –

+0

En fait, il existe une façon plus simple de définir ce champ: juste write config ["connectionString"] = yourConnectionString; la base.Initialize (nom, config); appelez et vous avez terminé!;) – jpatte

-1

Membership.ApplicationName = "yourfbaApplicationame"; MembershipUser user = Membership.CreateUser("admin,"password","[email protected]");

et assurez-vous que vous avez les entrées suivantes dans le fichier de configuration.

<connectionStrings> 
<add connectionString="server=sqd01-1-cll;database=FBA;Integrated Security=SSPI;" name="FBASqlConnString" providerName="System.Data.SqlClient"/> 

Si vous voulez toujours utiliser le code complet et ne pas avoir besoin d'utiliser le fichier de configuration. Utilisez ce qui suit

SqlMembershipProvider ObjSqlMembershipProvider = new SqlMembershipProvider(); 
      SqlRoleProvider ObjSqlRoleProvider = new SqlRoleProvider(); 
      NameValueCollection ObjNameValueCollRole = new NameValueCollection(); 
      NameValueCollection ObjNameValueCollMembership = new NameValueCollection(); 
      MembershipCreateStatus enMembershipCreateStatus; 

       ObjNameValueCollMembership.Add("connectionStringName", "Connection String Name"); 
       ObjNameValueCollMembership.Add("applicationName", "ApplicatioNAme"); 

       //these items are assumed to be Default and dont care..Should be given a look later stage. 
       ObjNameValueCollMembership.Add("enablePasswordRetrieval", "false"); 
       ObjNameValueCollMembership.Add("enablePasswordReset", "false"); 
       ObjNameValueCollMembership.Add("requiresQuestionAndAnswer", "false"); 
       ObjNameValueCollMembership.Add("requiresUniqueEmail", "false"); 
       ObjNameValueCollMembership.Add("passwordFormat", "Hashed"); 
       ObjNameValueCollMembership.Add("maxInvalidPasswordAttempts", "5"); 
       ObjNameValueCollMembership.Add("minRequiredPasswordLength", "1"); 
       ObjNameValueCollMembership.Add("minRequiredNonalphanumericCharacters", "0"); 
       ObjNameValueCollMembership.Add("passwordAttemptWindow", "10"); 
       ObjNameValueCollMembership.Add("passwordStrengthRegularExpression", ""); 

       //hard coded the Provider Name,This function just need one that is present. I tried other names and it throws error. I found this using Reflector ..all the rest are take care by the above 
       //name value pairs 
       ObjSqlMembershipProvider.Initialize("AspNetSqlMembershipProvider", ObjNameValueCollMembership);MembershipUser user = ObjSqlMembershipProvider.CreateUser("admin,"password","[email protected]");   

Un ceci Vous ne devez pas donner la chaîne de connexion dans le fichier de configuration. Si vous voulez que trop d'être à partir du code que vous devez hériter de la classe

+0

Il cherchait un moyen de spécifier la chaîne de connexion via le code .. – cbeuker

Questions connexes