2009-09-09 11 views
6

Tengo un sitio web ASP.NET v2.0 (no aplicación web) donde el directorio raíz es público, pero el subdirectorio "Admin" requiere autenticación. Todo sobre la configuración es muy genérico: utilicé una cadena de conexión definida en la raíz web.config, y el proveedor AspNetSqlMembershipProvider estándar, y estoy usando el control de inicio de sesión de ASP.NET. El archivo web.config en el directorio de administración especifica que el usuario debe tener el rol "Administrador".Obteniendo "Error de creación automática de archivo de base de datos SQLExpress" para el sitio que usa AspNetSqlMembershipProvider, pero la cadena de conexión es para SQL Server 2005

Estoy usando SQL Server 2008, y mi cadena de conexión es buena; cada página de nivel raíz es impulsada por datos y todos funcionan bien. Y la configuración del proveedor parece buena: cuando inicio sesión, el evento "OnLoggedIn" del control de inicio de sesión se dispara. La última línea en ese código de evento me redirecciona a mi página Admin/Default.aspx. Mi punto de interrupción en "OnLoggedIn" me demuestra que todo está bien hasta que la redirección hacia abajo en mi directorio de administración ... y luego ...

... y luego me espera ... y espera ...

Y luego aparece un error que dice que ha experimentado un "error de creación automática de archivos de la base de datos SQLExpress".

¿Por qué en el mundo está de repente tratando de crear un archivo de SQL Server Express? ¿Por qué de repente ignora mi cadena de conexión?

Una pista extraña: Justo antes de la última línea del evento "OnLoggedIn" puse en esto: bool blnTest = User.IsInRole ("Admin");

Quería ver si blnTest = true. Lo que sucede es que el proceso llega a esta línea ... y espera ... y finalmente me dice que no puede acceder a la base de datos de SQL Server Express. Parece que cualquier referencia (ya sea en mi código o detrás de escena) para determinar la función del usuario llama a la base de datos incorrecta.

EDITAR: Argh, a veces espera cuando pruebo blnTest. Otras veces informa inmediatamente el valor como "falso".

+1

¿Cuál es la cadena de conexión para su RoleProvider? ¿Es lo mismo que tu AuthenticationProvider? –

+0

Esa parte de web.config es simplemente esto ...

Respuesta

10

Según su comentario, parece que no ha configurado explícitamente un proveedor de funciones para su sitio.

Si todo eso está en su web.config es:

<roleManager enabled="true" /> 

Entonces usted está confiando en los proveedores de defecto declarado más arriba en la hieracrchy configuración (Machine.config, Web.config global, etc.)

En machine.config que probablemente tiene algo como:

<roleManager> 
    <providers> 
    <add name="AspNetSqlRoleProvider" 
     connectionStringName="LocalSqlServer" 
     applicationName="/" 
     type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> 
    <add name="AspNetWindowsTokenRoleProvider" 
     applicationName="/" 
     type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> 
    </providers> 
</roleManager> 

como se puede ver, el primer proveedor está configurado para utilizar una llamada connectionString LocalSqlServer - que también normalmente se declara en el machine.config:

<add name="LocalSqlServer" 
    connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
    providerName="System.Data.SqlClient"/> 

Y esto está diseñado para usar una base de datos local basada en archivos que se creará si aún no existe.

Así que para obtener papeles de trabajo en su sitio, que deben enmendar su raíz web.config a algo como:

<roleManager enabled="true"> 
    <providers> 
    <clear /> 
    <add name="AspNetSqlRoleProvider" 
     connectionStringName="YourConnectionStringName" 
     applicationName="/" 
     type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> 
    </providers> 
</roleManager> 

Usando el elemento transparente /> < eliminará todos los proveedores previamente definidos para ese tipo.

+2

+1 Para explicar todos los detalles –

+0

Gracias, sé que esta pregunta es muy antigua, pero también fue de gran ayuda para mí. Una pregunta, sé que tiene '' dentro de mis secciones '' y ''. Parece que contienen la misma información. ¿Alguien sabe por qué necesito ambos? –

+0

Porque puede tener diferentes (por ejemplo, puede querer un proveedor de roles personalizado que admita roles heredados, mientras que usted está satisfecho con el proveedor de membresía predeterminado). Además de eso, si miras de cerca verás que son diferentes: uno agrega el proveedor ** de membresía **, mientras que el otro agrega el proveedor ** de rol **. –

1

Cuando especifica la opción AttachDBFilename en la cadena de conexión, en realidad está solicitando su instancia de SQL Server aprovisionada en tiempo real, también conocida como la "instancia de usuario". Esta instancia se crea solicitando a la instancia 'principal' (la instancia. \ SQLEXPRESS) que aprovisione una instancia hija, lo que implica copiar el maestro/modelo/msdb en su perfil, comenzando un nuevo proceso de SQL Server con su cuenta configurada para usar el recién copiado master/model/msdb, luego preguntando a esta instancia 'hijo' para adjuntar el 'archivo' especificado como una nueva base de datos. Los detalles se explican en SQL Server 2005 Express Edition User Instances.

El proceso de creación de una instancia hija es extremadamente frágil y cuando se rompe la llamada DB da como resultado un error de tiempo de espera al abrir la conexión. En su caso, parece que el proceso se rompe en algunos casos (cuando llega a la parte protegida del sitio). Por qué se rompe, es muy difícil de adivinar sin la información adecuada. Consulte Problemas comunes en el artículo vinculado y vea si se aplica a usted. También verifique en el registro de eventos del sistema cualquier mensaje por el cual las instancias hijo no pueden iniciarse o no puede abrir el archivo MDF. Tenga en cuenta que un error común es solicitar el mismo archivo físico con AttachDBFilename con diferentes credenciales: cada credencial iniciará su propia instancia 'hija' y solo la primera logrará adjuntar la base de datos deseada.

+0

Como dije, estoy usando SQL Server 2008, no un archivo MDF. Mi cadena de conexión no tiene AttachDBFilename en ella. Fuente de datos = MYSERVER; Catálogo inicial = WebsiteDB; Id de usuario = MyUserID; Password = MyPassword; –

+0

Zhaph ya explicó por qué se usa LocalSqlServer (es decir, instancia de usuario Express) –

+0

Solo porque tenía todos los detalles de los comentarios;) –

0

tuve el mismo problema que se debió a que los servicios para el servidor sql estaban deshabilitados. compruebe en services.msc para ver si el servicio sqlexpress se está ejecutando si se comprueba para ver si tiene instalado sql express en su maxhine

Cuestiones relacionadas