2009-06-22 15 views
6

Estamos utilizando proveedores de membresía ASP.Net (el proveedor de SQL Server), y quiero poder configurar una cuenta de usuario de administrador como parte de nuestro instalador. Para hacer esto, necesito el proveedor de membresía ASP.Net configurado para que mi instalador pueda usarlo, pero no quiero tener que configurar un archivo de configuración para el instalador.¿Cómo puedo configurar los proveedores de membresía ASP.Net a través del código?

Entonces, ¿hay alguna manera de configurar una membresía ASP.Net a través del código sin escribir un proveedor personalizado?

Respuesta

7

Ok, después de la solución que evocaba aquí: http://forums.asp.net/p/997608/2209437.aspx

he creado una clase que, en el constructor sin parámetros (que necesita) simplemente obtiene el servidor y el puerto desde los argumentos de la línea de comando. De tal manera que puedo ir "MembershipInitializer.exe 'SomeSqlServer \ Instancia' 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); 
    } 
} 

En el app.config de la aplicación de consola (o ventanas de aplicación)

<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 usted está en necesidad de el proveedor de roles también mordió, probablemente deba sobrescribir SqlRoleProvider de la misma manera.

Si está creando un programa para inicializar automáticamente su base de datos de miembros a un estado específico, pero la dirección del servidor sql y el nombre del puerto aren ' t conocido hasta que alguien los ingresa en un puesto de asistente, esto hará el truco ..

¿Esto ayuda?

+0

Eso es más o menos a lo que llegué al final. Es una pena que nos veamos obligados a utilizar la reflexión para establecer miembros privados con el fin de hacer que esto funcione :-(. –

+0

En realidad, hay una manera más simple de establecer este campo: juste write config ["connectionString"] = yourConnectionString; before la base. Inicializar (nombre, configuración); llamar y listo!;) – jpatte

-1

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

y asegúrese de que usted tiene las siguientes entradas en el fichero de configuración.

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

Si aún desea utilizar el código completo y no necesita usar el archivo de configuración. Utilice el siguiente

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

Una ello, tiene que dar a la cadena de conexión en el archivo de configuración ningún otro movimiento. Si quieres que también sea desde el código necesario para heredar la clase

+0

Estaba buscando una forma de especificar la cadena de conexión a través del código ... – cbeuker

Cuestiones relacionadas