2009-06-22 11 views
6

Utilizziamo provider di appartenenze ASP.Net (il provider SQL Server) e desidero configurare un account utente di amministrazione come parte del nostro programma di installazione. Per fare questo, ho bisogno che il provider di appartenenze ASP.Net sia configurato in modo che il mio installatore possa usarlo, ma non voglio dover configurare un file di configurazione per l'installer.Come posso configurare i provider di appartenenze ASP.Net tramite codice?

Quindi esiste un modo per configurare un'appartenenza ASP.Net tramite codice senza scrivere un fornitore personalizzato?

risposta

7

Ok, dopo la soluzione che evocato qui: http://forums.asp.net/p/997608/2209437.aspx

ho creato una classe che, nel costruttore senza parametri (di cui avete bisogno) ottiene solo il server e la porta dagli argomenti della riga di comando. Tale che posso andare "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); 
    } 
} 

Nel app.config della console app (o le finestre app)

<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> 

Se hai bisogno di anche il provider di ruoli ha la precedenza su SqlRoleProvider, probabilmente allo stesso modo.

Se si sta creando un programma per inizializzare automaticamente il database di appartenenza su uno stato specifico, ma l'indirizzo del server SQL e il nome della porta non sono " Si sa fino a quando qualcuno non li inserisce in un stallo wizard, questo farà il trucco ..

Questo aiuto?

+0

Questo è praticamente quello che sono arrivato alla fine. E 'un peccato che siamo costretti a usare la reflection per impostare i membri privati ​​per farlo funzionare :-(. –

+0

In realtà c'è un modo più semplice per impostare questo campo: juste write config ["connectionString"] = yourConnectionString; la base.Initialize (nome, config); chiama e hai finito!;) – jpatte

-1

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

e assicurarsi di avere le seguenti voci nel file di configurazione.

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

Se ancora voleva utilizzare il codice completo e non avete bisogno di utilizzare il file di configurazione. Utilizzare il seguente

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]");   

Uno di questi è necessario dare la stringa di connessione nel file di configurazione nessun altro andare. Se si vuole che anche per essere dal codice è necessario ereditare la classe

+0

Stava cercando un modo per specificare la stringa di connessione tramite codice .. – cbeuker

Problemi correlati