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?
Increíble - Agregué 'cookieless =" UseCookies "' a la etiqueta '' en '', ¡y ahora funciona! ¡Genio, tú! :) –
¡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