Contexto.Usuario de perder los Papeles después de que se asigna en el Mundial.asax.Application_AuthenticateRequest

StackOverflow https://stackoverflow.com/questions/56271

Pregunta

Estoy utilizando la autenticación de Formularios en mi asp.net (3.5) de la aplicación.También estoy utilizando las funciones para definir lo que el usuario puede tener acceso a qué subdirectorios de la aplicación.Por lo tanto, las secciones pertinentes de mi web.archivo de configuración de este aspecto:

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="Default.aspx" path="/" protection="All" timeout="360" name="MyAppName" cookieless="UseCookies"  />      
  </authentication>
  <authorization >
    <allow users="*"/>
  </authorization>
</system.web>

<location path="Admin">
  <system.web>
    <authorization>
      <allow roles="Admin"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>

Basado en lo que he leído, este debe asegurarse de que los únicos usuarios que pueden acceder al directorio de la Administración serán los usuarios que se han Autenticado y se le asigna el rol de Administrador.

La autenticación de usuario, ahorrando el vale de autenticación, y otros problemas relacionados con todos funcionan bien.Si puedo quitar las etiquetas de la web.archivo de configuración, todo funciona bien.El problema viene cuando intento hacer cumplir que sólo los usuarios con el rol de Administrador debe ser capaz de acceder el directorio de la Administración.

Basado en este Artículo de microsoft knowledge base junto con otras páginas web dando la misma información, he añadido el siguiente código a mi Mundial.archivo asax:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
    if (HttpContext.Current.User != null) {
        if (Request.IsAuthenticated == true) {    
            // Debug#1            
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
            // In this case, ticket.UserData = "Admin"                
            string[] roles = new string[1] { ticket.UserData }; 
            FormsIdentity id = new FormsIdentity(ticket);
            Context.User = new System.Security.Principal.GenericPrincipal(id, roles);
            // Debug#2
        }
    }
}

Sin embargo, cuando trato de iniciar sesión en, no puedo acceder a la carpeta Admin (redirecciona a la página de inicio de sesión).

Tratando de depurar el problema, si me paso a través de una solicitud, si puedo ejecutar el Contexto.Usuario.IsInRole("Admin") en la línea marcada de Depuración#1 anterior, devuelve falso.Si puedo ejecutar la misma instrucción en la línea de Depuración#2, es igual a true.Así que por lo menos tan lejos como Global.asax se refiere, el Papel que se le ha asignado correctamente.

Después Del Mundial.asax, la ejecución salta a la página de inicio de Sesión (ya que la falta de papel hace que la página se carga en la carpeta admin a ser rechazado).Sin embargo, al ejecutar la misma instrucción en la primera línea de Page_Load de la de inicio de sesión, devuelve false.Así que en algún lugar después de Application_AuthenticateRequest en el Mundial.asax y la carga inicial del Formulario web en el directorio restringido, el papel de la información se ha perdido, causando errores de autenticación (nota:en el Page_Load, el vale de Autenticación todavía está asignada a un Contexto.Usuario.Id - sólo el papel que se está perdiendo).

¿Qué estoy haciendo mal y cómo puedo conseguir que funcione correctamente?


Actualización:He entrado en la solución a continuación

¿Fue útil?

Solución

Aquí estaba el problema y la solución:

En el desarrollo temprano, yo había ido a la página Web de menú y hacer clic en Asp.net de configuración.Esto resultó en la línea siguiente se añade a la web.config:

<system.web>
  <roleManager enabled="true" />
</system.web>

A partir de ese punto, la aplicación fue suponiendo que yo estaba haciendo funciones a través de la Asp.net administrador del sitio, y no a través de FormsAuthentication funciones.Por lo tanto los repetidos fracasos, a pesar del hecho de que la autenticación real y funciones de la lógica se ha configurado correctamente.

Después de esta línea fue eliminado de la web.config todo funcionó a la perfección.

Otros consejos

esto es sólo un disparo al azar, sino que son para que usted quede bloqueado debido a que el pedido de autorización para la Administración?Tal vez usted debería tratar de cambiar su denegar todo y a tu Admin.

Sólo en caso de que sobreescritos por la niegan.

(Yo había ejemplos de código en el aquí, pero que no aparecían.

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