Pregunta

Estamos intentando implementar formAuthentication en nuestro sitio, pero en un escenario para el que aún no hemos podido encontrar una solución, aparte de crear nuestro propio HttpModule y hacer la lógica personalizada nosotros mismos, así que pensé en desechar el pregunta que había para ver si esta era realmente la única solución.

Nos gustaría usar formAuthentication además de los proveedores de membresía personalizados, pero nos gustaría usar un proveedor diferente para diferentes carpetas.Nuestro sitio divide estas secciones con subcarpetas (por ejemplo:~/Admin, ~/GoldCustomer, ~/SilverCustomer, ~/BronzeCustomer), por lo que nos gustaría utilizar diferentes proveedores de membresía para cada sección/subcarpeta.Usando el marco para soportar esto, implementaríamos nuestro web.config como:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<location path="Admin">
<system.web>
  <authentication mode="Forms">
    <forms name="AdminAuth" loginUrl="~/AdminLogin.aspx" />
  </authentication>
  <membership defaultProvider="AdminProvider" >
    <providers >
      <add connectionStringName="ConnString" name="AdminProvider" type="Assembly.AdminMembershipProvider" ... />
    </providers>
  </membership>
</system.web>
</location>
<location path="GoldCustomer">
  <system.web>
  <authentication mode="Forms">
    <forms name="GoldCustomerAuth" loginUrl="~/GoldCustomerLogin.aspx" />
  </authentication>
  <membership defaultProvider="GoldCustomerProvider" >
    <providers >
      <add connectionStringName="ConnString" name="GoldCustomerProvider" type="Assembly.GoldCustomerMembershipProvider" ...="" />
    </providers>
  </membership>
</system.web>
</location>
<system.web>
  <compilation debug="true" />
  <authentication mode="Forms" />
</system.web>
</configuration>

Sin embargo, hacer esto da como resultado un error de tiempo de ejecución:

Es un error utilizar una sección registrada como enableDefinition='MachineToApplication' más allá del nivel de la aplicación.Este error puede deberse a que un directorio virtual no está configurado como una aplicación en IIS.

Line 11:   <location path="Admin">
Line 12:     <system.web>
Line 13:       <authentication mode="Forms">
Line 14:         <forms name="FormsAdmin" loginUrl="~/login.aspx" />
Line 15:       </authentication>

Parece que la única forma de lograr lo que estamos intentando es con un HttpModule personalizado, o cambiar nuestro enfoque (como dividir las carpetas en diferentes aplicaciones web en IIS).¿Es esto correcto o me falta algo?¿O hay otras alternativas que no conozco?

¡Gracias por tu ayuda!

¿Fue útil?

Solución

En primer lugar, creo que la seguridad basada en roles tiene mucho sentido para su aplicación si tiene control sobre las bases de datos.Pero si no puedes cambiarlo, no se puede.

La solución alternativa puede ser un formulario de inicio de sesión de puerta de enlace que redirija al usuario al formulario de inicio de sesión específico de la carpeta según ReturnUrl variable de cadena de consulta y ese formulario utilizará el proveedor que desea validar al usuario.Luego utiliza el FormsAuthentication.RedirectFromLoginPage para configurar una cookie de autenticación y redirigir a la página anterior.Puede configurar los roles y utilizar la seguridad basada en roles para controlar el acceso a cada carpeta con <authorization> etiquetar en web.config.

Otros consejos

No estoy seguro de lo que intenta hacer, pero ¿qué hay de los roles para cada uno de estos tipos de clientes? Limite el acceso por un rol para cada subcarpeta, pero aún tendría 1 proveedor de membresía y 1 proveedor de roles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top