2011-07-05 20 views
5

Mi código de inicio de sesión, después de la autenticación:IsAuthenticated funciona en el navegador, pero no con Air client.

var authTicket = new FormsAuthenticationTicket(
       1, 
       userName, 
       DateTime.Now, 
       DateTime.Now.AddMinutes(20), // expiry 
       false, 
       roles, 
       "/"); 
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket)); 
Response.Cookies.Add(cookie); 

y, gracias a Darin Dimitrov, tengo una costumbre Autorizar atributo:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)] 
public class TJAuthorize : AuthorizeAttribute { 
    public override void OnAuthorization(AuthorizationContext filterContext) { 
     string cookieName = FormsAuthentication.FormsCookieName; 

     if (!filterContext.HttpContext.User.Identity.IsAuthenticated || 
       filterContext.HttpContext.Request.Cookies == null || filterContext.HttpContext.Request.Cookies[cookieName] == null) { 
        HandleUnauthorizedRequest(filterContext); 
      return; 
     } 

     var authCookie = filterContext.HttpContext.Request.Cookies[cookieName]; 
     var authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
     string[] roles = authTicket.UserData.Split(','); 

     var userIdentity = new GenericIdentity(authTicket.Name); 
     var userPrincipal = new GenericPrincipal(userIdentity, roles); 

     filterContext.HttpContext.User = userPrincipal; 
     base.OnAuthorization(filterContext); 
    } 

Todo esto funciona muy bien cuando estoy trabajando en una sesión del navegador. Pero ahora estoy trabajando con un cliente Flash/Adobe Air, y el atributo de autenticación está causando un error. Al poner declaraciones de depuración en el código, puedo decir que:

filterContext.HttpContext.User.Identity.IsAuthenticated 

es falso, incluso después de un inicio de sesión exitoso.

¿Por qué debería haber alguna diferencia entre utilizar un cliente de navegador y un cliente de Air? ¿Y cómo soluciono esto?

EDIT: Otra pista: después de poner en algunas declaraciones de depuración más, he encontrado que la filterContext.HttpContext.User.Identity no está ajustada correctamente al hacer la llamada de Aire - la propiedad Name sale en blanco! La ID de la sesión es correcta, la ID de la cookie es correcta, pero el User.Identity no está configurado. Alguna idea de por qué esto esta pasando?

Respuesta

4

Quizás HttpCookieMode (http://msdn.microsoft.com/en-us/library/system.web.httpcookiemode.aspx) está configurado en el valor incorrecto?

El valor predeterminado es UseDeviceProfile ... ¿qué ocurre cuando se fuerza a UseCookies?

+0

Increíble - Agregué 'cookieless =" UseCookies "' a la etiqueta '' en '', ¡y ahora funciona! ¡Genio, tú! :) –

+0

¡Yay! ¡Gracias G-d! ... fue un esfuerzo de equipo, ¡gran trabajo, Shaul! Gracias @vnuk por ayudarnos a pensar en la dirección correcta también! – davidkomer

2

Es una idea remota, pero IsAuthenticated depende de que la cookie ASPXAUTH del cliente (o lo que sea que haya llamado id) se envíe con la solicitud. Asegúrese de que flash/air está enviando esa cookie (por wireshark o cualquier otra herramienta de red)

+0

Sí, bien, pero estoy enviando la cookie ASPXAUTH, he comprobado que es lo mismo que lo que se devuelve después de la autenticación ... –

+0

Debe haber algo diferente en la solicitud de aire. Capture ambas solicitudes con wireshark y compárelas. – Vnuk

+0

Estoy trabajando con Shaul en esto ... estamos usando Charles y no hay diferencias en las Cookies (aunque hay diferencias en otros parámetros) – davidkomer

0

¿Aparece el HttpContext.User.Identity en Application_AuthorizeRequest en global.asax?

+0

Mismo comportamiento que en cualquier otra parte: cuando se llama desde el navegador, sí ; cuando se llama desde Air, no. –

Cuestiones relacionadas