Pregunta

Esto puede ser una pregunta un poco ignorante, pero Im nuevo a MVC así lo siento!

Me estudiado el modelo de autenticación cena empollón pero en mi aplicación tengo una autenticación basada en papel complicado. Así que lo que hago es la siguiente:

 void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
        {
            HttpCookie authCookie = HttpContext.Current.Request
               .Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie != null)
            {
                string encTicket = authCookie.Value;
                if (!String.IsNullOrEmpty(encTicket))
                {
                    FormsAuthenticationTicket ticket = 
                            FormsAuthentication.Decrypt(encTicket);
                    CustomIdentity id = new CustomIdentity(ticket.Name);
                    GenericPrincipal prin = new GenericPrincipal(id, id.Roles);
                    HttpContext.Current.User = prin;
                }
            }
        }

En LogOn que la autenticación de nombre de usuario / contraseña con FormsAuth y luego se crea la cookie.

El problema aquí es cada vez que se crea la identidad personalizada, tengo que consulta la base de datos para los roles de usuarios . ¿Hay un correcta forma de evitar esto o estoy haciendo lo correcto para consultar la base de datos en cada petición entrante? ¿Debo guardar la lista de papeles en una galleta o algo?

Asimismo, no comprendía muy bien todo el ciclo de vida de las formas de autenticación cómo se encarga de la autenticación? Yo uso el mismo patrón de diseño IFormsAuthentication que los usuarios cena empollón y durante un inicio de sesión que llamo FormsAuth.SignIn() que a su vez llama a FormsAuthentication.SetAuthCookie, ¿Cuándo se las arreglan para llamar al método membershipservice.validateuser() ?? Además, si el cookies de autenticación ha sido ajustada ¿por qué NERD cena crear un billete, a continuación, agregarlo a la solicitud, y luego leerlo durante PostAuthenticationRequest para comprobar qué usuario lo era. ¿La operación billete como una sesión?

Gracias! Feliz Navidad!


Actualizar Este enlace me dio un sobre ligeramente mejor comprensión forma vale de autenticación.

¿Fue útil?

Solución

Un enfoque alternativo es almacenar papeles de su usuario en el vale de autenticación cuando se autentica el usuario. A continuación, para cada solicitud (método Application_AuthenticateRequest del archivo global.asax) se puede extraer el papel del vale de autenticación y crear un GenericPrincipal.

Ver esta respuesta para más detalles.

Otros consejos

"correcta?" Es una cuestión de opinión.

Yo diría que, si usted no está experimentando problemas con el rendimiento de la base de datos causada por esta consulta, a continuación, no se preocupe de ello.

Si usted es, usted puede centralizar su código de autenticación en algún tipo de autenticación proveedor o el tipo y la información de autenticación de caché en la memoria hasta una escritura actualiza la base de datos, que debe invalidar la caché al mismo tiempo.

(Su segunda pregunta haría bien por su propia cuenta;. No tengo suficiente información para responder a ella)

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