Mein Anmeldecode, nach der Authentifizierung:
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);
und, dank der Darin Dimitrow Ich habe ein benutzerdefiniertes Attribut Authorize:
[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);
}
Das alles funktioniert wunderbar, wenn ich in einer Browser-Sitzung arbeite. Aber jetzt arbeite ich mit einem Flash/Adobe Air-Client, und das Authentifizierungsattribut verursacht einen Fehler. Indem ich Debug-Anweisungen in den Code einfüge, kann ich das feststellen:
filterContext.HttpContext.User.Identity.IsAuthenticated
ist falsch - auch nach einer erfolgreichen Anmeldung!
Warum sollte es einen Unterschied zwischen der Verwendung eines Browser-Clients und eines Air-Clients geben? Und wie kann ich das beheben?
EDITAR: Ein weiterer Hinweis: Nachdem ich einige weitere Debug-Anweisungen eingegeben habe, habe ich festgestellt, dass die filterContext.HttpContext.User.Identity
nicht korrekt eingestellt ist, wenn Sie den Anruf aus der Luft tätigen - die Name
Eigentum geht leer aus! Die Sitzungs-ID ist korrekt, die Cookie-ID ist korrekt - aber die User.Identity
nicht gesetzt ist. Haben Sie eine Idee, warum dies der Fall sein könnte?